Grovs
The Grovs MCP server lets AI assistants manage all aspects of the Grovs growth platform — deep links, analytics, campaigns, and app configuration — through natural language.
Account & Project Management: Retrieve account info, list all projects and domains, check instance usage and subscription limits, and create new projects with production and test environments.
Deep Link Management: Create deep links with custom names, paths, metadata (title, subtitle, image), tags, and data payloads; retrieve link details by path or URL; update existing links; search and list links with pagination, filtering, and sorting; and archive/deactivate links.
Analytics: Access project-level aggregated metrics (views, installs, opens, revenue) with period comparisons, view per-link daily analytics, and identify top-performing links ranked by views.
Campaign Management: Create campaigns to group related links, list campaigns with aggregated metrics and filtering, and archive campaigns (which also deactivates their associated links).
Redirect Configuration: Set per-platform fallback URLs for iOS App Store, Google Play, web, and desktop, plus a global fallback.
SDK Configuration: Configure iOS settings (bundle ID, team ID, App Store ID) and Android settings (package name, SHA256 fingerprints).
Provides deep linking and SDK configuration for Android apps, including Play Store redirects and platform-specific settings.
Provides deep linking and SDK configuration for iOS apps, including App Store redirects and platform-specific settings.
Integrates with Windsurf editor via MCP to provide Grovs management capabilities within the development environment.
Supports containerized deployment of the MCP server for self-hosted Grovs instances.
Provides SDK integration for Flutter mobile apps to enable deep linking, attribution, and analytics functionality.
Integrates with VS Code via MCP to provide Grovs management capabilities within GitHub Copilot-enabled environments.
Provides deep linking and SDK configuration for iOS apps, including bundle ID and team ID settings for Apple platforms.
What is Grovs?
Grovs is an open-source, privacy-first growth platform for mobile apps — a self-hostable alternative to Branch.io and AppsFlyer. It provides:
Deep Linking — one link that routes users to the right content across iOS, Android, and web. Deferred deep links survive the install flow so users land on the right screen on first open.
Attribution — deterministic, first-party install and event attribution. No fingerprinting, no data sharing with ad networks.
Revenue Analytics — in-app purchases, subscriptions, and custom revenue events matched back to the campaign that drove the install.
Campaigns — group links, track performance, and compare results across channels.
EU-hosted, open-source SDKs, 20M+ daily active users in production. See the backend repo for self-hosting.
Related MCP server: cc-plugin-mcp
What is this MCP server?
This is an MCP (Model Context Protocol) server that lets AI assistants manage your Grovs platform through natural language. Create deep links, check analytics, configure redirects, run campaigns — without leaving your editor.
Quick Start
Claude Code
/plugin marketplace add grovs-io/mcp
/plugin install grovs@grovsInstalls the MCP server and skills that teach Claude how to use Grovs. On first use, a browser window opens for OAuth — no API keys needed.
Cursor
Open Settings > MCP and add a new server:
{
"mcpServers": {
"grovs": {
"url": "https://mcp.grovs.io/mcp"
}
}
}Windsurf
Add to ~/.codeium/windsurf/mcp_config.json:
{
"mcpServers": {
"grovs": {
"serverUrl": "https://mcp.grovs.io/mcp"
}
}
}VS Code (GitHub Copilot)
Add to your .vscode/mcp.json:
{
"servers": {
"grovs": {
"type": "http",
"url": "https://mcp.grovs.io/mcp"
}
}
}ChatGPT Desktop
Open Settings > MCP Servers > Add Server and enter:
https://mcp.grovs.io/mcpSelf-Hosted
If you're running your own Grovs backend, run the MCP server locally and point your client to it:
git clone https://github.com/grovs-io/mcp.git
cd mcp
npm install && npm run build
npm startOr with Docker:
docker build -t grovs-mcp .
docker run -p 8080:8080 grovs-mcpThen use http://localhost:8080/mcp as the server URL in any of the client configs above.
All clients will trigger an OAuth flow on first use — a browser window opens to authenticate with your Grovs account.
Configuration
Variable | Default | Description |
|
| Server port |
|
| Grovs backend URL (override for self-hosted) |
|
| Public URL of this MCP server (used for OAuth callbacks) |
Copy .env.example to .env for local development.
Tools
Tool | Description |
| Account info, instances, projects, and domains |
| Usage metrics and subscription status for an instance |
| Create a new instance with production and test projects |
| Create a deep link with metadata, tags, and custom data |
| Get full details of a link by path |
| Update a link's metadata, tags, or redirects |
| Deactivate a link (irreversible) |
| Search and list links with pagination and filters |
| Project-level metrics: views, installs, opens, revenue |
| Per-link daily metrics |
| Top performing links ranked by views |
| Create a campaign to group related links |
| List campaigns with aggregated metrics |
| Archive a campaign and deactivate its links |
| Set per-platform redirect behavior (App Store, Play Store, web) |
| Configure iOS/Android SDK settings (bundle ID, team ID, etc.) |
Architecture
MCP Client (Claude Code, Cursor, etc.)
│
│ MCP protocol over HTTP
▼
Express app (src/app.ts)
│
├── OAuth flow (/authorize, /callback, /register)
│
└── MCP endpoint (/mcp)
│
├── Tool registration (src/server.ts)
│ Zod schema validation + runWithAuth error boundary
│
├── Handlers (src/tools/handlers.ts)
│ Business logic, plain functions, throw on error
│
├── Formatters (src/tools/formatters.ts)
│ Convert API JSON to human-readable text
│
└── API client (src/api-client.ts)
HTTP calls to Grovs backendDevelopment
npm run dev # start with auto-reload
npm run build # compile TypeScript
npm test # run tests (186 tests)
npm run test:watch # run tests in watch mode
npm run lint # ESLint
npm run format # PrettierSee CONTRIBUTING.md for project structure and PR guidelines.
SDKs
Platform | Repository |
iOS | |
Android | |
React Native | |
Flutter |
License
Available Tools
16 toolsarchive_campaignArchive CampaignAInspect
Archive a campaign and deactivate all its links. This action cannot be undone. Always confirm with the user before calling.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | Prod or Test Project ID from get_status (use the Prod/Test Project ID columns, NOT the instance ID) | |
| campaign_id | Yes | Campaign ID from list_campaigns |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description discloses key behavioral traits: 'This action cannot be undone' (irreversibility) and 'deactivate all its links' (side effect). Adds significant context beyond 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?
Two concise sentences: first states the action, second adds irreversible consequence and user confirmation requirement. No redundant information; every sentence earns its place.
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?
Covers action, side effects, irreversibility, and user validation. Lacks explicit mention of return value, but given the destructive nature and absence of output schema, the description is sufficiently complete for agent 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 coverage is 100% with detailed parameter descriptions. The tool description enhances understanding by specifying that project_id must use 'Prod or Test Project ID columns, NOT the instance ID' and that campaign_id comes from list_campaigns, adding crucial usage nuance.
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 'Archive a campaign' (verb + resource) and mentions 'deactivate all its links', distinguishing it from sibling tools like 'archive_link' (archives a single link) and 'update_link' (modifies without archiving).
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?
Explicitly instructs 'Always confirm with the user before calling', which is essential given the irreversible nature. Provides clear contextual guidance but does not list alternative tools for non-archiving scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
archive_linkArchive Deep LinkAInspect
Archive (deactivate) a deep link. The link will stop redirecting users. This action cannot be undone. Always confirm with the user before calling.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | Prod or Test Project ID from get_status (use the Prod/Test Project ID columns, NOT the instance ID) | |
| link_id | Yes | Numeric link ID from search_links or get_link |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description discloses the destructive nature (cannot be undone) and the effect (stops redirecting). The confirmation guideline adds behavioral context. Could mention other side effects like analytics implications.
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?
Two sentences, front-loaded with action and effect, no unnecessary words.
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 description covers the core action and important warnings. It lacks return value information, but for a simple archive operation this is acceptable. No output schema to compensate.
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 100%, so the schema already explains the parameters. The description adds no extra parameter information, meeting baseline expectations.
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 archives (deactivates) a deep link and specifies the effect (stops redirecting). This distinguishes it from sibling tools like create_link or update_link.
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?
Provides a clear usage instruction to confirm with the user before calling, which is crucial for an irreversible action. However, it does not explicitly differentiate from sibling archive_campaign or mention when not to use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
configure_redirectsConfigure RedirectsAInspect
Set where users are sent when they open a deep link — per platform (iOS App Store, Google Play, desktop website) and a global fallback URL.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | Prod or Test Project ID from get_status (use the Prod/Test Project ID columns, NOT the instance ID) | |
| ios_redirect | No | iOS redirect URL (e.g. App Store link) | |
| android_redirect | No | Android redirect URL (e.g. Play Store link) | |
| desktop_redirect | No | Desktop fallback URL | |
| web_redirect | No | Web fallback URL | |
| fallback_url | No | Global fallback URL for all platforms |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It discloses the action and per-platform nature but does not mention side effects, permissions, or behavior on invalid URLs.
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?
Single sentence, front-loaded with the core purpose, no wasted words.
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?
Tool is straightforward with 6 params, no output schema. Description covers purpose and parameter roles but lacks usage guidelines and behavioral notes, leaving gaps for full agent guidance.
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 coverage is 100% with descriptions for each parameter. The description adds value by grouping parameters per platform and clarifying the fallback URL as global, which is not explicit in the schema.
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?
Description clearly states the verb 'Set' and the resource 'where users are sent when they open a deep link', specifying per-platform and global fallback. This distinguishes it from sibling tools like create_link or update_link.
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 usage for configuring redirects but does not explicitly state when to use this vs. alternatives, nor does it mention when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
configure_sdkConfigure Platform SDKAInspect
Configure platform-specific SDK settings for an instance — iOS bundle ID, Android package name, desktop app URLs. Required for deep links to open the correct app.
| Name | Required | Description | Default |
|---|---|---|---|
| instance_id | Yes | Instance ID from get_status | |
| ios_bundle_id | No | iOS bundle identifier (e.g. com.myapp.ios) | |
| ios_team_id | No | Apple Developer Team ID | |
| ios_app_store_id | No | iOS App Store ID | |
| android_package_name | No | Android package name (e.g. com.myapp.android) | |
| android_sha256_fingerprints | No | Android SHA256 certificate fingerprints for App Links | |
| desktop_url | No | Desktop app download URL |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. While it explains the purpose, it does not disclose side effects, required permissions, or whether changes take effect immediately. This is a moderate gap for a configuration tool.
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 concise: two sentences totaling about 20 words. It front-loads the action and follows with the necessity, with no extraneous information.
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 no output schema and 7 parameters, the description could be more complete. It mentions the purpose and high-level parameter categories but omits behavioral details like idempotency or effect on existing settings. 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?
Schema description coverage is 100%, so baseline is 3. The description lists parameter categories but does not add significant insight beyond what the schema already provides. No examples or additional context are given.
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 configures platform-specific SDK settings for an instance, listing specific parameters (iOS bundle ID, Android package name, desktop app URLs). It also explains the purpose (required for deep links), making it distinct from sibling tools like configure_redirects.
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 context ('Required for deep links to open the correct app'), implying when the tool should be used. However, it does not explicitly mention when not to use it or suggest alternatives among siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_campaignCreate CampaignAInspect
Create a campaign to group related deep links. After creating, use create_link with campaign_id to add links to this campaign.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | Prod or Test Project ID from get_status (use the Prod/Test Project ID columns, NOT the instance ID) | |
| name | Yes | Campaign name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the burden of explaining behavior. It states the creation action and implies the campaign is immediately available for linking. However, it lacks details on side effects, authorization requirements, or what happens if a campaign with the same name exists. The description is adequate but not comprehensive.
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 consists of two short sentences that are front-loaded with the core purpose. Every word serves a function—no redundancy or fluff. It is highly concise while still providing essential workflow guidance.
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 has no output schema, the description should ideally mention what is returned (e.g., campaign ID). It implies the return of a campaign_id by referencing it in the follow-up step, but it does not explicitly state the return value. For a simple 2-parameter tool, the description covers the main actions but lacks explicit return 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?
The input schema has high description coverage (100%), with both parameters described in detail. The description does not add extra meaning beyond the schema—it only mentions 'project_id' without additional context. According to the guideline, high schema coverage leads to a baseline of 3, which is appropriate here.
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 'Create a campaign to group related deep links.' It specifies the verb (create), resource (campaign), and purpose (grouping deep links). This distinguishes it from sibling tools like create_link (adds links to a campaign) and archive_campaign.
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 direct guidance: 'After creating, use create_link with campaign_id to add links to this campaign.' This outlines the workflow and suggests when to use the tool (when creating a new campaign) and what to do next. It does not explicitly state when not to use it, but the context is clear given sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_linkCreate Deep LinkAInspect
Create a deep link in a project. Only 'name' is required — the URL path is auto-generated from the name. Optionally set title/subtitle for link previews, tags for organization, and a data payload that gets passed to the app on open.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | Prod or Test Project ID from get_status (use the Prod/Test Project ID columns, NOT the instance ID) | |
| name | Yes | Link name (also used to generate the URL slug) | |
| path | No | Custom URL path slug (e.g. 'summer-sale') — auto-generated from name if omitted | |
| title | No | Preview title shown when link is shared | |
| subtitle | No | Preview subtitle shown when link is shared | |
| image_url | No | Preview image URL shown when link is shared | |
| tags | No | Tags for organizing links | |
| data | No | JSON payload passed to the app when the link is opened | |
| custom_redirects | No | OPTIONAL per-platform overrides. Omit for the default behavior (open app if installed, else App Store from configure_sdk). Three forms per platform: • Omit entirely → app + App Store fallback (default) • Flat string `{ios: 'https://...'}` → app + custom URL fallback (open app if installed, else this URL) • Object `{ios: {url: 'https://...', open_app_if_installed: false}}` → custom URL ONLY (skip the app-open attempt) | |
| campaign_id | No | Campaign ID to add this link to (from list_campaigns or create_campaign) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description bears full responsibility. It reveals that the path is auto-generated and optional fields are available, but it does not disclose error handling, validation rules, rate limits, or authentication needs. The description is adequate but not comprehensive.
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 concise with two sentences, front-loading the core action and key behavior (auto-generated path). Every sentence adds value without redundancy.
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 complexity (10 parameters, nested objects, no output schema or annotations), the description is too sparse. It omits important parameters like custom_redirects and campaign_id, and does not explain return values, error scenarios, or how this tool fits into workflows with sibling tools.
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 coverage is 100%, so baseline is 3. However, the description fails to mention several parameters (custom_redirects, campaign_id, image_url) and adds minimal value beyond the schema's own descriptions. It highlights some parameters but omits others, reducing its helpfulness for an agent.
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 creates a deep link in a project, specifies that only 'name' is required with auto-generated URL path, and lists optional fields. It is a specific verb+resource combination that naturally distinguishes from sibling tools like update_link or archive_link.
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 creating a new deep link) but does not provide explicit guidance on when not to use it or alternatives. It lacks context about prerequisites (e.g., project must exist) or comparisons with other tools like configure_redirects.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_projectCreate ProjectAInspect
Create a new Grovs project. This provisions a production and test environment with their own domains for deep links.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Project name (e.g. 'My App') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Reveals that it provisions production and test environments with domains, but no mention of other side effects, permissions, or irreversibility. No annotations to supplement.
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?
Two sentences, no fluff, front-loaded with core purpose.
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?
Adequate for a simple creation tool with one parameter and no output schema. Could mention return value or next steps but not strictly necessary.
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 coverage is 100% and description adds no additional parameter information beyond the schema.
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?
Clearly states 'Create a new Grovs project' with specific verb and resource, and adds detail about provisioning environments. Distinguishes from siblings like create_campaign, create_link.
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?
Clear context for creating a project, but no explicit when-not-to-use or alternatives mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_analytics_overviewProject AnalyticsAInspect
Get aggregated analytics for a project: views, opens, installs, new/returning users, revenue. Compares current period vs previous period. Defaults to last 30 days.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | Prod or Test Project ID from get_status (use the Prod/Test Project ID columns, NOT the instance ID) | |
| start_date | No | Start date (YYYY-MM-DD), defaults to 30 days ago | |
| end_date | No | End date (YYYY-MM-DD), defaults to today | |
| platform | No | Filter by platform: ios, android, desktop, web |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses key behaviors: it compares current vs previous period and defaults to last 30 days. However, with no annotations, it does not explicitly state that it is a read-only operation or mention any permissions or rate limits, though such detail is often assumed for analytics tools.
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?
Two concise sentences, front-loaded with purpose and metrics. No unnecessary words; every sentence adds value.
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?
While there is no output schema, the description lists expected metrics (views, opens, installs, users, revenue), which compensates. It does not explain the return structure but is adequate for an overview tool. No reference to sibling tools.
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?
Input schema covers 100% of parameters with descriptions. The description adds value by clarifying the default date range and the comparative analysis (current vs previous period), which is not in the schema. However, parameter descriptions mostly suffice.
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 retrieves aggregated analytics for a project and lists specific metrics (views, opens, installs, users, revenue). It implicitly distinguishes from sibling tools like get_link_analytics by specifying 'project' vs individual links.
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?
No explicit guidance on when to use this tool versus alternatives such as get_link_analytics or get_usage. The description implies it is for project-level overview but does not provide exclusions or contextual recommendations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_linkGet Link DetailsAInspect
Look up a deep link by its path slug or full URL. Returns full link details including preview metadata, tags, data payload, and custom redirects.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | Prod or Test Project ID from get_status (use the Prod/Test Project ID columns, NOT the instance ID) | |
| path | Yes | Link path slug (e.g. 'summer-sale') or full URL (e.g. 'https://myapp.grovs.io/summer-sale') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must cover behavioral traits. It mentions the return details but does not explicitly state that the operation is read-only, lack side effects, or any required permissions. Basic transparency but not thorough.
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, front-loaded with the action and scope, and provides necessary details without any redundant or wasteful phrasing.
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 no output schema, the description adequately covers what is returned (full link details with examples). The input is well-documented in schema. Slight gap: no mention of potential empty results or errors, but sufficient for a lookup tool.
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?
Input schema has 100% coverage with descriptions for both parameters. The description adds little beyond confirming that 'path' can be a slug or full URL, which the schema already states. No additional semantic value for 'project_id'.
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 verb ('look up'), the resource ('deep link'), and the method ('by its path slug or full URL'). It also specifies the return content, distinguishing it from siblings like search_links or get_link_analytics.
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 does not provide guidance on when to use this tool versus alternatives, nor does it mention when not to use it. No explicit context for selection among sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_link_analyticsLink AnalyticsAInspect
Get analytics for a specific link by its path slug or full URL: views, opens, installs, engagement time, referrals. Defaults to last 30 days.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | Prod or Test Project ID from get_status (use the Prod/Test Project ID columns, NOT the instance ID) | |
| path | Yes | Link path slug (e.g. 'summer-sale') or full URL (e.g. 'https://myapp.grovs.io/summer-sale') | |
| start_date | No | Start date (YYYY-MM-DD) | |
| end_date | No | End date (YYYY-MM-DD) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It describes the tool as a read operation ('get'), but does not explicitly state it is non-destructive, nor disclose any potential side effects, rate limits, or authorization requirements beyond the implied project_id.
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 a single, well-structured sentence that front-loads the key action and lists the metrics. No extraneous words.
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 no annotations and no output schema, the description lacks essential context: it does not explain the return format, error handling, or the critical detail that project_id must come from get_status. The schema provides details, but the description is too brief for a tool with 4 parameters.
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 coverage is 100%, so baseline is 3. The description adds value by clarifying the default date range ('Defaults to last 30 days') and confirming the 'path' parameter accepts slug or full URL, echoing schema descriptions but providing context.
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 it retrieves analytics for a specific link by path slug or full URL, listing the metrics (views, opens, etc.). This distinguishes it from siblings like get_analytics_overview (overall) and get_top_links (top links).
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 mentions a default of last 30 days, hinting at optional date parameters, but does not specify when to use this tool over alternatives (e.g., get_analytics_overview for broader scope). No explicit when-to or when-not-to guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_statusGet Account & ProjectsAInspect
Returns the authenticated user's account info and all their Grovs projects with domains. Call this first to discover available project IDs before using other tools.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Since no annotations exist, the description carries full burden. It correctly indicates read behavior for authenticated user, but could explicitly state it's read-only and safe to call repeatedly. No annotation contradiction.
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?
Single sentence conveying purpose and usage suggestion with zero redundancy. Every word earns its place.
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 zero parameters, no output schema, and a rich set of sibling tools that depend on project IDs, the description fully equips an agent to use this tool correctly by explaining its output and invocation priority.
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?
No parameters in schema, so baseline is 4. Description adds no parameter info, but none needed since schema coverage is 100% with zero parameters.
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 account info and all projects with domains, distinguishing it from siblings that operate on specific projects. 'Call this first' emphasizes its unique role.
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?
Explicitly advises to call this tool first to discover project IDs before using other tools, providing clear when-to-use guidance and identifying its prerequisite function.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_top_linksTop Performing LinksAInspect
Get the top performing links ranked by views. Returns each link with its view, open, and install counts. Defaults to top 10 over last 30 days.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | Prod or Test Project ID from get_status (use the Prod/Test Project ID columns, NOT the instance ID) | |
| start_date | No | Start date (YYYY-MM-DD) | |
| end_date | No | End date (YYYY-MM-DD) | |
| platform | No | Filter by platform: ios, android, desktop, web | |
| limit | No | Number of links to return (default: 10) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It states ranking by views and defaults, but omits behavior like descending order, pagination absence, and edge cases (e.g., no links found). Adequate but not detailed.
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?
Two sentences, front-loaded with purpose and key defaults. Every sentence adds value; no superfluous text. Excellent conciseness.
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 simple tool (5 params, no output schema, no annotations), the description covers the core purpose, output fields, and defaults. It lacks explicit ordering direction but is otherwise sufficient for a minimal viable description.
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 coverage is 100%, baseline 3. Description adds value by specifying default limit (10) and default date range (last 30 days), which are not in the schema. This extra context helps the agent understand typical usage.
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 gets top performing links ranked by views, specifies return fields (view, open, install counts), and includes default values. This distinguishes it from sibling tools like get_link (single link) and search_links (filtered search).
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 usage for retrieving top links by views with defaults, but does not explicitly guide when to use this vs. alternatives like get_link_analytics or get_analytics_overview. No exclusions or conditions are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_usageGet Instance UsageAInspect
Check usage metrics and subscription status for an instance. Returns current MAU count, MAU limit, and whether the quota is exceeded. Call get_status first to find instance IDs.
| Name | Required | Description | Default |
|---|---|---|---|
| instance_id | Yes | Instance ID from get_status |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description must cover behavioral traits. It implies a read-only operation ('Check'), but does not explicitly state it is non-destructive or mention authentication or rate limits. The description is adequate but could be more transparent.
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?
Two sentences, each adding value. The first sentence states purpose and outputs; the second provides usage guidance. No extraneous words.
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 parameter, no output schema), the description covers what it returns and the prerequisite. It could optionally specify the output format, but the listed fields (MAU count, MAU limit, quota exceeded) provide sufficient context.
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 100% for the single parameter 'instance_id', which the schema already describes as 'Instance ID from get_status'. The description reinforces that but adds no new semantic meaning beyond the schema.
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 checks usage metrics and subscription status, returning specific data like MAU count and limit. It uses a specific verb ('Check') and resource ('usage metrics and subscription status'), but does not explicitly differentiate itself from 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?
Explicit prerequisite guidance is provided: 'Call get_status first to find instance IDs.' While it doesn't specify when to use versus alternatives, the tool's unique function makes context clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_campaignsList CampaignsBInspect
List campaigns with aggregated metrics (views, opens, installs, revenue). Supports pagination, search by name, date range filtering, and sorting.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | Prod or Test Project ID from get_status (use the Prod/Test Project ID columns, NOT the instance ID) | |
| page | No | Page number (default: 1) | |
| per_page | No | Results per page (default: 20) | |
| term | No | Search by campaign name | |
| sort_by | No | Sort by: name, created_at, views, opens, installs, revenue | |
| ascendent | No | Sort ascending (default: false = descending) | |
| start_date | No | Metrics start date (YYYY-MM-DD, default: 30 days ago) | |
| end_date | No | Metrics end date (YYYY-MM-DD, default: today) | |
| platform | No | Filter metrics by platform: ios, android, desktop, web | |
| archived | No | Filter by archived status |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must cover behavioral traits. It only states the high-level purpose (listing campaigns) without disclosing details like data freshness, rate limits, response size limits, or whether metrics are real-time. The description adds little beyond the tool's name.
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?
A single, well-structured sentence that front-loads the core action and key features. Every element is meaningful and efficiently communicates the tool's functionality with no redundancy.
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 10 parameters with full schema descriptions and no output schema, the description adequately summarizes the tool's capabilities. It covers the main features (metrics, pagination, search, filtering, sorting). Could mention pagination behavior (e.g., total pages or response structure) but is otherwise complete for a list tool.
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 100%, so the input schema already documents all parameters well. The description adds a general summary of capabilities (pagination, search, filtering, sorting) but does not provide additional meaning for individual parameters beyond what schema descriptions already offer. Baseline 3 is appropriate.
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 lists campaigns with aggregated metrics, mentioning specific metrics (views, opens, installs, revenue) and capabilities (pagination, search, filtering, sorting). It distinguishes itself from sibling tools like get_analytics_overview or get_top_links by its broad scope, though it could explicitly note when to prefer this over others.
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?
No guidance on when to use this tool versus alternatives such as get_analytics_overview or get_top_links. The description does not mention prerequisites, when not to use it, or alternative tools for different scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_linksSearch & List LinksAInspect
Search or list all deep links in a project. Returns links with their view/open/install metrics. Supports pagination, search by name, and sorting.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | Prod or Test Project ID from get_status (use the Prod/Test Project ID columns, NOT the instance ID) | |
| page | No | Page number (default: 1) | |
| limit | No | Results per page (default: 20) | |
| search | No | Search by link name, title, path, or tags | |
| sort_by | No | Sort by: name, created_at, views, opens, installs | |
| sort_order | No | Sort direction |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations, so description fully informs behavior. Discloses return of metrics, pagination, search, and sorting. Lacks details on auth or rate limits but sufficient for safe use.
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?
Two sentences, no wasted words. Front-loaded with purpose and key capabilities.
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?
No output schema, but description mentions returned metrics. Could specify other fields like name/ID, but overall adequate for a list tool with good parameter descriptions.
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 has 100% coverage, so baseline is 3. Description adds little beyond summarizing pagination/search/sort capabilities.
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?
Clearly states verb 'Search or list', resource 'deep links', and scope 'in a project'. Mentions returned metrics, distinguishing from single-link retrieval 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?
Implies usage for searching/filtering links but provides no explicit guidance on when to use instead of siblings like list_campaigns or get_top_links.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_linkUpdate Deep LinkBInspect
Update an existing deep link. Only include the fields you want to change.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | Prod or Test Project ID from get_status (use the Prod/Test Project ID columns, NOT the instance ID) | |
| link_id | Yes | Numeric link ID from search_links or get_link | |
| name | No | New link name | |
| path | No | New URL path slug | |
| title | No | Preview title | |
| subtitle | No | Preview subtitle | |
| image_url | No | Preview image URL | |
| tags | No | Tags | |
| data | No | JSON payload for the app | |
| custom_redirects | No | OPTIONAL per-platform overrides. Three forms per platform: • Omit entirely → app + App Store fallback (default) • Flat string `{ios: 'https://...'}` → app + custom URL fallback (open app if installed, else this URL) • Object `{ios: {url: 'https://...', open_app_if_installed: false}}` → custom URL ONLY (skip the app-open attempt) | |
| campaign_id | No | Campaign ID to assign this link to |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description must fully disclose behavioral traits. It only states 'Update' indicating mutation, but does not mention idempotency, return values, required permissions, error cases, or side effects. This leaves significant gaps for an AI agent.
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 with two short sentences that convey the core purpose and a critical usage hint. No unnecessary words or details, making it easy to parse quickly.
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 complexity (11 parameters, no output schema, nested objects), the description is insufficient. It does not explain return behavior, error handling, lifecycle implications, or how the update interacts with other tools. The agent lacks critical context for reliable 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?
The input schema has 100% description coverage for all 11 parameters. The tool description adds no additional meaning beyond what the schema already provides. Per guidelines, baseline 3 is appropriate since the schema does the heavy lifting.
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 explicitly states 'Update an existing deep link', which is a specific verb and resource. It clearly distinguishes from sibling tools like create_link and get_link by indicating an update operation on an existing link.
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 a key guideline: 'Only include the fields you want to change', which implies a partial update. However, it lacks explicit guidance on when to use this tool vs alternatives (e.g., create_link for new links) or any prerequisites.
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.
16 tool updates
v0.1.0- First observed
archive_campaign - First observed
archive_link - First observed
configure_redirects - First observed
configure_sdk - First observed
create_campaign - First observed
create_link - First observed
create_project - First observed
get_analytics_overview - First observed
get_link - First observed
get_link_analytics - First observed
get_status - First observed
get_top_links - First observed
get_usage - First observed
list_campaigns - First observed
search_links - First observed
update_link
TDQS
Scored across 16 tools
Each tool targets a distinct resource and action. Links, campaigns, projects, analytics, and configuration are clearly separated with no overlapping functionality. Similar tools like search_links vs get_link serve different querying purposes.
All tools follow a consistent verb_noun pattern (e.g., create_campaign, get_link_analytics, archive_link). Verbs are descriptive and nouns match the resource. No style mixing or vague names.
16 tools is appropriate for a deep-linking service, covering project setup, campaign management, link CRUD, analytics, and configuration. Each tool serves a distinct need without redundancy or bloat.
The tool surface covers the essential lifecycle: create, read, update, and delete (via archive) for links, plus campaign and project management. Analytics and configuration are well-represented. Missing hard delete for campaigns/projects, but archiving covers deactivation.
Maintenance
Related MCP Connectors
- SupabaseOAuthcom.supabase
MCP server for interacting with the Supabase platform
MCP server for progressive tool usage at any scale (see https://klavis.ai)
Hosted MCP server for AI-driven data ops. Create apps, manage schemas, and CRUD structured data.
Related MCP Servers
- AlicenseBqualityDmaintenanceMCP server for managing Claude Code conversation sessions1268 npmMIT
- AlicenseBqualityDmaintenanceMCP server for accessing Claude Code plugins. Enables retrieving plugin lists and detailed information via MCP clients like Claude Desktop, Cursor.2MIT
- AlicenseNot gradedqualityBmaintenanceA dead simple MCP server for exposing your app functions to AI agents like Claude Desktop.6 npm6MIT
- AlicenseAqualityBmaintenanceCode intelligence MCP server for Claude Code providing multi-project code graph, semantic search, session history, knowledge base, and web search.153MIT