oxilytics-mcp
OfficialProvides access to App Store analytics for your apps, including downloads, crashes, reviews, and sync health, through a self-hosted OxiLytics instance.
Provides access to Google Play analytics for your apps, including downloads, crashes, reviews, and sync health, through a self-hosted OxiLytics instance.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@oxilytics-mcpWhich countries have the most downloads?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
OxiLytics MCP server
A read-only Model Context Protocol server for OxiLytics, self-hosted app analytics for the App Store and Google Play.
It lets an AI assistant answer questions about your apps — downloads, crashes, reviews, sync health — by talking to your own OxiLytics instance. Your data stays on your server.
Read-only by design
OxiLytics API tokens are read-only, enforced on the server: any non-GET request
made with a token is rejected with 403 read_only_token. This MCP server can
read your analytics and nothing else. It cannot change settings, edit products,
trigger syncs or touch users — not because it politely declines, but because the
server refuses.
Related MCP server: safe-sql-mcp
Requirements
An OxiLytics instance (self-hosted)
A read-only API token: My profile → API tokens → Create
Python 3.10+
Install
uv tool install oxilytics-mcpOr from source:
git clone https://github.com/oxisoft/oxilytics-mcp
cd oxilytics-mcp
uv pip install -e .Configure
The server reads two environment variables:
Variable | Meaning |
| Base URL of your instance, e.g. |
| Your read-only API token |
| Optional: path to a file containing the two above, if you prefer not to put a token in your client config |
Claude Desktop
Add to claude_desktop_config.json:
{
"mcpServers": {
"oxilytics": {
"command": "uvx",
"args": ["oxilytics-mcp"],
"env": {
"OXILYTICS_SERVER_URL": "https://analytics.example.com",
"OXILYTICS_TOKEN": "oxi_your_token_here"
}
}
}
}If you would rather keep the token out of the config file, drop it in a
chmod 600 file as OXILYTICS_TOKEN=... and set OXILYTICS_ENV_FILE to that
path instead.
Tools
Tool | What it answers |
| Start here. Stores configured, app and product counts, totals, recent sync outcomes. |
| Store listings with ids, platform, rating, last sync. Filter by name or show unassigned. |
| Products with download and crash totals. |
| Totals for a metric over a range, compared to the preceding period. |
| A metric over time, by day, week or month. |
| Ranked countries for a metric. |
| User reviews, filterable by rating, country and free text. |
| Recent sync runs with status and row counts. |
| One run's log, grouped by default, full lines on request. |
Metrics: downloads, redownloads, updates, uninstalls, crashes, anrs,
active_devices.
Zero is not always zero
When a store has not delivered data yet, the honest answer is "no data", not
"zero downloads". Those look identical in a number and mean very different
things. Where every value comes back zero, these tools say so and point you at
sync_run_log rather than letting you conclude your app has no users.
Example questions
"How are my apps doing this month?"
"Which countries download Sudoku the most?"
"Show me every one-star review mentioning crashes."
"Did the last sync actually work?"
License
MIT
Available Tools
9 toolslist_appsA
List store listings, with ids, platform, rating and last sync time.
Use this to find the app_id that other tools need, or to see which apps are not yet released.
Args: search: Case-insensitive filter on the app name. unassigned: Show only listings not yet attached to a product.
| Name | Required | Description | Default |
|---|---|---|---|
| search | No | ||
| unassigned | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It states what is listed but does not disclose behavioral traits such as pagination, result limits, default ordering, or any error conditions. As a read operation it likely has no side effects, but that is not stated. The lack of behavioral context is a notable gap for a tool with zero annotation support.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a purpose sentence, two use-case sentences, and a labeled Args block. It is concise and front-loaded with the primary purpose. No filler or redundant statements.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list tool with two optional parameters and an output schema, the description covers the core purpose, use cases, and parameter semantics. The output schema handles return value details. Missing behavioral traits (pagination, defaults) are the only gaps, but given the tool's simplicity, it is reasonably complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description explains both parameters clearly: 'search: Case-insensitive filter on the app name' and 'unassigned: Show only listings not yet attached to a product.' This adds meaning beyond the bare schema, which only gives types and defaults. It fully compensates for the 0% schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('List') and resource ('store listings') and lists the fields returned (ids, platform, rating, last sync time). It also gives a clear use case (finding app_id). However, it does not explicitly differentiate from the sibling list_products, leaving some ambiguity about when to choose this over that.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit use cases: 'find the app_id that other tools need' and 'see which apps are not yet released.' This tells the agent when to invoke the tool, but it does not mention alternatives or when not to use it, leaving a small gap in routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_productsA
List products with download and crash totals.
A product groups one app across stores and platforms. Products are the business-level view; apps are the per-store listings underneath them.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. The verb 'List' implies a read-only operation and the description states the returned data includes download and crash totals. It does not mention ordering, pagination, data freshness, or whether the list is unfiltered, but these gaps are less critical for a parameterless listing tool with an output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences: the first states the primary purpose, and the second provides essential domain context. Every sentence earns its place with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless list tool with an output schema present, the description is complete enough. It covers what is listed, what metrics are included, and how products relate to apps, so an agent can invoke it confidently.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so there is no parameter detail for the description to add. The product-versus-app explanation gives useful semantic context for the objects being returned, which satisfies the baseline for a no-parameter tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool as listing products with download and crash totals. It also differentiates products from apps, which directly distinguishes this tool from the sibling list_apps.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context by explaining that products are the business-level view and apps are per-store listings underneath. It does not explicitly name list_apps as the alternative, but the conceptual separation effectively routes an agent to the right tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
metricsA
Totals for every metric over a date range, against the preceding period.
Args: days: Look-back window, ignored when frm is given. frm: Start date YYYY-MM-DD. to: End date YYYY-MM-DD, defaults to yesterday. app_id: Restrict to one store listing. product_id: Restrict to one product. platform: Restrict to a platform, e.g. ios or android. store: Restrict to one store.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | ||
| frm | No | ||
| days | No | ||
| store | No | ||
| app_id | No | ||
| platform | No | ||
| product_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It discloses the key behavioral traits: totals are computed against the preceding period, days is ignored when frm is provided, and to defaults to yesterday. It does not mention limits or grouping, but the output schema exists to describe the return shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-structured: one front-loaded summary sentence followed by a scannable Args list. Every parameter earns its place and there is no filler or repetition of schema defaults.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-optional-parameter aggregating tool with an output schema, the description covers the input semantics, defaults, and precedence thoroughly. The main gaps are not naming which metrics are included and not indicating when to prefer this over sibling tools like timeseries or overview.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description compensates fully by documenting all 7 parameters with concrete semantics: what each filter restricts, the precedence rule for days/frm, and the date format/default. This goes well beyond the bare schema properties.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns totals for every metric over a date range with a comparison to the preceding period. The intended output is unambiguous, though the verb is implicit rather than explicit and it does not differentiate itself from siblings like timeseries or overview.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Parameter behavior is explained well, including the days/frm precedence and the default for to. However, the description never states when to use this tool versus alternatives such as timeseries or overview, so the choice of tool is only implied by the word 'Totals'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
overviewA
Start here. Overall state of the OxiLytics instance.
Reports which stores are configured, how many apps and products exist, totals for the last N days, and the outcome of recent sync runs. Answers "how are things doing" and "is anything broken" in a single call.
Args: days: Look-back window for the totals.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It accurately describes the read-only nature of the tool by detailing what information it reports, and it adds context about the aggregation of data across stores, apps, and sync runs. It does not mention any side effects, but the framing makes clear it is a query-only operation. It does not contradict any annotation since none exist.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is exceptionally concise, leading with 'Start here.' and then a compact list of what the tool reports. It has no filler and is front-loaded with the most important usage signal. The Args section is minimal and clear, making the entire definition easy to parse at a glance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one optional parameter) and the existence of an output schema, the description is complete. It states what the tool reports and the meaning of the parameter. There is no missing information an agent would need to decide whether to call this tool or to understand its high-level behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does so fully by explaining the sole parameter 'days' as the 'Look-back window for the totals,' which adds semantic meaning beyond the schema's type and default. This is sufficient for an agent to understand the parameter's purpose and effect.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb ('reports') and resource ('overall state of the OxiLytics instance'), listing exactly what it covers: configured stores, app/product counts, totals over a look-back window, and recent sync outcomes. It also positions itself as the entry point ('Start here'), distinguishing it from the more focused sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit usage context with 'Start here' and frames the tool as answering 'how are things doing' and 'is anything broken' in a single call. It implies this is the first stop, but it does not name specific alternative tools or explicitly state when to use them instead. The context is clear enough for an agent to select this for high-level status checks.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reviewsA
User reviews, newest first, with optional filters.
Use to read what users actually say, or to find complaints about a feature.
Args: limit: How many reviews to return. rating: Comma-separated ratings, e.g. "1,2" for negative reviews only. country: Two-letter country code. query: Free-text search within the review body. app_id: Restrict to one store listing. product_id: Restrict to one product.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | No | ||
| app_id | No | ||
| rating | No | ||
| country | No | ||
| product_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description carries the full burden. It discloses meaningful behaviors: results are 'newest first,' all arguments are optional filters, query searches 'within the review body,' and rating is a comma-separated string. It implies a read-only operation via 'read what users actually say,' though it does not discuss pagination, errors, or auth requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: a one-line overview, a one-line use-case statement, and a tight Args list. Every sentence and parameter entry earns its place, with no redundant or promotional language.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given six optional parameters, no annotations, and an output schema that presumably describes the return shape, the description covers the essentials: what reviews are, how they are ordered, when to use the tool, and what each filter does. Minor gaps remain (for example, pagination behavior or whether app_id and product_id are mutually exclusive), but an agent can confidently invoke it with the provided information.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description fully compensates by explaining all six parameters in plain language. It adds practical meaning that the schema lacks: limit is the number of reviews, rating is comma-separated with an example, country is a two-letter code, query searches the review body, and app_id/product_id restrict to one store listing or product.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'User reviews, newest first, with optional filters,' naming a specific, identifiable resource and its default ordering. The follow-up 'Use to read what users actually say, or to find complaints about a feature' gives a concrete verb and use case that distinguishes it from sibling tools like metrics or overview.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use to read what users actually say, or to find complaints about a feature' provides clear, explicit use cases, signaling when this tool is appropriate. It does not explicitly name alternatives or state when not to use it, but the qualitative-vs-quantitative framing is enough to route an agent correctly in most cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sync_run_logA
The log of one sync run; the way to find out why a run produced no data.
By default returns a summary that groups repeated messages, which is the fast way to see what happened across many apps.
Args: run_id: Which run to inspect, from sync_runs. full: Return every line instead of the grouped summary. level: Only show lines at this level.
| Name | Required | Description | Default |
|---|---|---|---|
| full | No | ||
| level | No | ||
| run_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Since there are no annotations provided, the description must carry the behavioral disclosure. It states that by default it groups repeated messages and provides a 'full' parameter for the opposite, which reveals the aggregation behavior. It does not describe what happens when no lines match 'level' or the exact return shape, but the output schema exists. It adds value by explaining the grouping, which is not apparent from the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, with a clear opener, a practical tip, and a structured Args section. It is front-loaded with the main purpose. It could be slightly more compact, but every sentence earns its place, explaining the default behavior and each parameter's intent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is of moderate complexity: it has 3 parameters, an output schema exists (so return values are documented), and no nested objects. The description covers the purpose, default behavior, and parameter meanings. With the output schema present, it need not describe return values. It's complete for an agent to call it correctly, though it could hint at error scenarios (e.g., invalid run_id).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema contains parameter names and types but no descriptions (coverage 0%). The description adds critical semantics: for 'run_id', it says 'Which run to inspect, from sync_runs' – linking to another tool. For 'full', it clarifies 'Return every line instead of the grouped summary' – explaining its purpose beyond just a boolean. For 'level', it says 'Only show lines at this level' – clarifying the enum's meaning. This fully compensates for the lack of schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: to inspect the log of a specific sync run and understand why a run produced no data. It explicitly mentions it returns a summary by default, and differentiates itself from sibling tools like 'sync_runs' (which lists runs) and 'metrics' or 'overview' (which provide other analytical views). The specificity of 'log of one sync run' is distinct and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use this tool: when you need details about a specific sync run, especially to diagnose why no data was produced. It contrasts the default grouped summary with the 'full' option for detailed lines. However, it does not explicitly state when NOT to use it or name an alternative, but given the clear domain (logs), the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sync_runsA
Recent sync runs with status and row counts.
Use to check whether data collection is working and when it last ran.
Args: limit: How many runs to return. store: Restrict to one store.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| store | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description carries the full burden of behavioral disclosure. It communicates a read-only monitoring behavior and the included fields (status, row counts), but it does not clarify the meaning of 'recent', the ordering of results, or behavior when no runs exist.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely compact: a one-line result statement, a one-line purpose statement, and a minimal Args block. There is no filler, and the most important information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple listing tool with two optional parameters and an output schema, the description is nearly complete. It could add a note pointing to sync_run_log for detailed per-run logs, but this is not necessary for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description fully compensates by explaining both parameters: limit ('how many runs to return') and store ('restrict to one store'). The schema supplies enum values and defaults, so an agent has everything needed to use the parameters correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool returns recent sync runs with status and row counts, and it identifies the intended use case: checking whether data collection is working and when it last ran. It lacks an explicit verb like 'list' or 'fetch', and it does not distinguish itself from the sibling sync_run_log, but the resource and purpose are unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description says exactly when to use the tool: to check data collection health and the time of the last run. It does not mention exclusions or explicitly point to alternatives like sync_run_log for deeper per-run detail, but the stated use case is enough for an agent to select it appropriately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
timeseriesA
A metric over time, bucketed by day, week or month.
Use to spot trends, spikes, and the effect of a release.
Args: metric: Which metric to plot. bucket: Time bucket size. days: Look-back window, ignored when frm is given. frm: Start date YYYY-MM-DD. to: End date YYYY-MM-DD. app_id: Restrict to one store listing. product_id: Restrict to one product. store: Restrict to one store.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | ||
| frm | No | ||
| days | No | ||
| store | No | ||
| app_id | No | ||
| bucket | No | day | |
| metric | No | downloads | |
| product_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral disclosure burden. It explains the bucketing behavior, the precedence rule that 'days' is ignored when 'frm' is given, and that several parameters act as restrictions. This is meaningful behavioral context beyond the schema, though it does not explicitly state read-only status or timezone/data-availability caveats.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: a one-line definition, a one-line use case, then a terse argument list. Every sentence and arg line earns its place, with no repetition of schema defaults or enum values.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 8 parameters, no required fields, no annotations, and an existing output schema, the description covers the parameter semantics and intended usage well. Minor gaps remain, such as what happens when 'to' is omitted or how frm/to interact beyond the days override, but these are unlikely to prevent correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate—and it does. Every one of the 8 parameters receives a plain-language explanation, including date formats (YYYY-MM-DD), the interaction between days and frm, and what each restriction filter does. This fully bridges the gap left by the schema's bare titles and defaults.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool as a time-bucketed metric visualization ('A metric over time, bucketed by day, week or month') and gives concrete use cases like spotting trends, spikes, and release effects. It does not explicitly differentiate from sibling tools such as metrics or overview, but the resource and purpose are still clear enough for an agent to understand what it does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit context for when to use the tool: 'Use to spot trends, spikes, and the effect of a release.' This is a clear intended-use signal. It does not explicitly state when not to use it or name alternative sibling tools, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
top_countriesA
Ranked countries for a metric over a date range.
Args: metric: Which metric to rank by. limit: How many countries to return. days: Look-back window. app_id: Restrict to one store listing. product_id: Restrict to one product.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | ||
| limit | No | ||
| app_id | No | ||
| metric | No | downloads | |
| product_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Since no annotations are provided, the description carries full responsibility for disclosing behavioral traits. It does not mention whether the operation is read-only, any rate limits, error handling, or the structure of the response. It only describes the purpose and parameters, leaving the agent to guess at side effects or limitations. This is a significant gap for a tool with no annotation support.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is highly concise: a single purpose sentence followed by a clean parameter list. It is front-loaded with the core purpose and then provides exactly the needed parameter explanations. No unnecessary words or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that an output schema exists, the return format is already defined and need not be described. However, the description does not cover any behavioral context (e.g., whether app_id and product_id are mutually exclusive, how the date range is interpreted, or any limitations on limit/days). For a simple ranking tool this is acceptable, but it leaves some ambiguity. Overall, it is adequate but not comprehensive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds meaningful explanations for each parameter beyond the schema: 'metric: Which metric to rank by,' 'limit: How many countries to return,' 'days: Look-back window,' 'app_id: Restrict to one store listing,' 'product_id: Restrict to one product.' The schema provides types and defaults but no descriptions, so the description compensates well. However, it could be slightly more specific (e.g., clarifying that metric is from an enum, but the schema already shows that).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear purpose: 'Ranked countries for a metric over a date range.' It specifies the resource (countries), the action (rank), and the context (metric and date range). This distinguishes it from sibling tools like overview or metrics, which likely have broader or different scopes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives like metrics, timeseries, or overview. It only lists parameters without any 'use this when' or 'for X use Y' context. An agent would have to infer that this tool is for country-level ranking, but no explicit comparison or usage scenario is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
9 tool updates
v0.1.0- First observed
list_apps - First observed
list_products - First observed
metrics - First observed
overview - First observed
reviews - First observed
sync_run_log - First observed
sync_runs - First observed
timeseries - First observed
top_countries
TDQS
Scored across 9 tools
Each tool has a clearly distinct purpose: overview summarizes overall state, list_apps and list_products enumerate entities, metrics provides totals, timeseries gives time-bucketed data, top_countries ranks by country, reviews returns user feedback, and sync_runs/sync_run_log cover data collection. Even the overlapping filter-heavy tools (metrics, timeseries, top_countries) are unambiguously differentiated by their output shape and descriptions.
All tool names use snake_case and are concise, but they mix conventions: list_apps and list_products use verb_noun, while others are bare nouns (metrics, timeseries, reviews) or compound nouns (top_countries, sync_run_log). The style is internally consistent and readable, but not strictly uniform.
With 9 tools, the server is well-scoped for a read-only analytics and monitoring domain. Each tool serves a distinct analytical or operational need, and none feel redundant or superficial. This is squarely within the ideal 3–15 range.
The tool surface covers the full lifecycle of the server's purpose: high-level health (overview), entity discovery (list_apps, list_products), data analysis (metrics, timeseries, top_countries), qualitative feedback (reviews), and operational diagnostics (sync_runs, sync_run_log). There are no obvious gaps for a read-only analytics tool—write operations are intentionally out of scope.
Maintenance
Related MCP Connectors
Draxlr's remote MCP server connects AI assistants to your SQL databases and dashboards. Explore schemas, run read-only queries, manage saved queries and dashboards, and export results, all with row-level security so each user sees only their own data.
Safe, read-only Postgres and MySQL access for AI agents. Audit log + column-level controls.
Query 40 databases from Claude, ChatGPT, or Cursor — on any device. Read-only, encrypted, audited.
- OsboonOAuthcom.osboon
Read-only AI access to Osboon business card analytics, viewers, links, connections and contacts.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to connect and query Microsoft SQL Server databases using natural language, executing read-only SQL queries for safe data inspection and analysis.MIT
- FlicenseNot gradedqualityDmaintenanceEnables read-only SQL database access for AI assistants, allowing schema exploration and safe query execution without risk of data modification.-
- AlicenseNot gradedqualityCmaintenanceEnables AI assistants to explore SQL Server schemas, relationships, and execute safe SQL queries with read-only mode by default and optional write control.1MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI assistants to query Microsoft SQL Server safely through natural language, with an iron-clad read-only guarantee enforced at both database and application levels.MIT