DeepLinkNow MCP Server
OfficialDeepLinkNow MCP server helps coding agents add and manage deferred deep linking, inspect link-domain setup, and plan migrations.
Get platform-specific setup guides and code for iOS, Android, React Native, Expo, or Flutter (
get_setup_guide).Search the full DeepLinkNow documentation for topics like error codes, options, plan limits, or configuration (
search_docs).Check any domain’s Universal Links/App Links setup via AASA, Apple CDN, assetlinks.json, Google verdict, and ad-block list status (
check_domain).Explain deferred deep link fingerprint match confidence scores, quality, and
minConfidencechoices (explain_match_result).Plan and generate code diffs to migrate from Firebase Dynamic Links, Branch, AppsFlyer, or Adjust (
migrate_from).List existing app links with search, campaign filter, and paging using a private API key and paid plan (
list_links).Create links with custom paths, link-page text, social previews, metadata, or campaigns using a private API key and paid plan (
create_link).Access bundled docs resources (
deeplinknow://llms.txt,deeplinknow://docs/{page}) and prompts for adding deferred deep linking or migrating.
Checks whether a link domain or its CNAME chain appears on AdGuard block lists, helping identify domains that may be blocked.
Provides setup steps and code for adding deferred deep linking to Android apps, including App Links configuration and assetlinks.json validation.
Validates Universal Links setup by checking apple-app-site-association and Apple's CDN copy for a domain.
Provides setup steps and code for adding deferred deep linking to Expo apps.
Provides a migration plan and code diff for moving from Firebase Dynamic Links to DeepLinkNow.
Provides setup steps and code for adding deferred deep linking to Flutter apps.
Checks assetlinks.json and Google's Digital Asset Links API verdict to validate Android App Links setup.
Provides setup steps and code for adding deferred deep linking to iOS apps, including Universal Links configuration.
Provides setup steps and code for adding deferred deep linking to React Native apps.
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., "@DeepLinkNow MCP Serveradd deferred deep linking to my React Native app"
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.
@deeplinknow/mcp
The DeepLinkNow MCP server. It lets coding agents (Claude Code, Cursor, VS Code, Windsurf and any other MCP client) add deferred deep linking to an iOS, Android, React Native, Expo or Flutter app, check a link domain's Universal Links and App Links setup, and migrate from Firebase Dynamic Links, Branch, AppsFlyer or Adjust.
DeepLinkNow does deep linking only: Universal Links and App Links on your domain, and deferred deep links that survive an install. No attribution, ad tracking or advertising IDs. Any path on your link domain already works as a deep link.
Tools
Tool | Needs a key | What it does |
| No | Setup steps and code for |
| No | Searches the full DeepLinkNow docs and returns the matching sections with links |
| No | Checks a domain's |
| No | Explains a fingerprint match's |
| No | A migration plan and code diff from |
| Private key, paid plan | Lists the app's links (dashboard, API and on-demand), with search and paging |
| Private key, paid plan | Creates a link with a custom path, link-page text, social preview, metadata or campaign |
It also exposes deeplinknow://llms.txt and deeplinknow://docs/{page} as resources, and two prompts: add_deferred_deep_linking and migrate_to_deeplinknow.
Related MCP server: deeptap-mcp
Install
Requires Node.js 20 or later. The server runs locally over stdio.
One click, no key needed:
Claude Code, one line:
claude mcp add deeplinknow -- npx -y @deeplinknow/mcpThe docs, setup and domain-check tools work without an account or key. Add a private key only for list_links and create_link (see the per-client configs below). More on deeplinknow.com/docs/mcp.
Try it
Once it's installed, ask your agent:
"Use DeepLinkNow to add deferred deep linking to this Expo app. Our link domain is myapp.deeplinknow.com."
"Check whether links.example.com's AASA and assetlinks.json files are set up correctly."
"We use Firebase Dynamic Links. Plan our move to DeepLinkNow for this app."
"A DeepLinkNow match came back MEDIUM with a score of 58. Should we route it?"
Claude Code
claude mcp add deeplinknow -- npx -y @deeplinknow/mcpWith the link tools (--scope user keeps the key out of the project's .mcp.json):
claude mcp add deeplinknow --scope user --env DEEPLINKNOW_API_KEY=YOUR_PRIVATE_KEY -- npx -y @deeplinknow/mcpCursor
Add to .cursor/mcp.json in the project, or ~/.cursor/mcp.json for every project:
{
"mcpServers": {
"deeplinknow": {
"command": "npx",
"args": ["-y", "@deeplinknow/mcp"],
"env": { "DEEPLINKNOW_API_KEY": "${env:DEEPLINKNOW_API_KEY}" }
}
}
}Leave out env if you don't need the link tools.
VS Code
Add to .vscode/mcp.json. VS Code asks for the key once and stores it securely:
{
"inputs": [
{
"type": "promptString",
"id": "deeplinknow-api-key",
"description": "DeepLinkNow private API key (dln_priv_…), only for list_links and create_link. Leave empty otherwise.",
"password": true
}
],
"servers": {
"deeplinknow": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@deeplinknow/mcp"],
"env": { "DEEPLINKNOW_API_KEY": "${input:deeplinknow-api-key}" }
}
}
}Windsurf
Add to ~/.codeium/windsurf/mcp_config.json:
{
"mcpServers": {
"deeplinknow": {
"command": "npx",
"args": ["-y", "@deeplinknow/mcp"],
"env": { "DEEPLINKNOW_API_KEY": "YOUR_PRIVATE_KEY" }
}
}
}Leave out env if you don't need the link tools. This file is in your home directory, so the key isn't committed with your project.
Other clients
Any MCP client that runs stdio servers: command npx, arguments -y @deeplinknow/mcp.
Configuration
Variable | Default | Meaning |
| unset | Your app's private key ( |
|
| API base URL. Must be https (http only for localhost). |
Never put the private key in your app: the app uses the public key (dln_pub_…). The server never prints, logs or returns the key; it only sends it in the x-api-key header to the API.
Tell your agent about it
Paste AGENTS.md into your repo's AGENTS.md or CLAUDE.md so every agent session knows how to use DeepLinkNow.
Privacy Policy
What it sends, and where.
get_setup_guide,search_docs,migrate_fromand the resources fetch public docs fromhttps://deeplinknow.com.check_domainfetches onlyhttps://<the domain you give it>/.well-known/…, Apple's CDN (app-site-association.cdn-apple.com), Google's Digital Asset Links API and the four public block lists; it refuses domains that resolve to private or local addresses.list_linksandcreate_linksend your API key and the link fields you give them to the DeepLinkNow API.explain_match_resultmakes no requests.What it stores. Nothing on disk. Docs, block lists and check results are cached in memory while the server runs (docs for an hour, block lists for a day, domain results for 5 minutes).
No telemetry. The server collects no usage data and has no analytics.
DeepLinkNow's own data handling is in the privacy policy. Questions: deeplinknow.com.
Develop
pnpm install
pnpm test # vitest, network mocked
pnpm typecheck
pnpm lint # Ultracite (Biome)
pnpm build # dist/, runnable with node dist/index.js
pnpm smoke # starts dist/index.js over stdio and lists the toolsThe spec, with requirement IDs (MCP-…) that the tests cite, is docs/sdks/mcp.md in the DeepLinkNow repository.
License
MIT
Available Tools
7 toolscheck_domainCheck a deep link domainARead-onlyIdempotent
Checks a link domain the way iOS and Android will: the apple-app-site-association file (and Apple's CDN copy), the assetlinks.json file (and Google's Digital Asset Links verdict), and whether the domain or its CNAME chain is on the EasyPrivacy or AdGuard block lists that ad blockers use. Works for any domain, not only DeepLinkNow's. Runs on this machine: it fetches only https:///.well-known/*, Apple's CDN, Google's API and the block lists, and refuses domains that resolve to private addresses.
| Name | Required | Description | Default |
|---|---|---|---|
| checks | No | Which checks to run (default: all three). aasa = iOS Universal Links file plus Apple's CDN copy; assetlinks = Android App Links file plus Google's Digital Asset Links verdict; adblock = the domain and its CNAME chain against EasyPrivacy and AdGuard lists (the first run downloads about 22 MB of lists, then reuses them for a day). | |
| domain | Yes | The link domain to check: a hostname (go.example.com, myapp.deeplinknow.com) or any URL on it. Only the hostname is used. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnly/idempotent/non-destructive, but the description goes well beyond them: it discloses the exact network egress (only https://<domain>/.well-known/*, Apple's CDN, Google's API, and the block lists), an SSRF-style safety guard ('refuses domains that resolve to private addresses'), and the ~22 MB first-run block-list download that is cached for a day. These are precisely the runtime traits an agent needs and that the annotations cannot convey.
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 main check enumeration is front-loaded in the first sentence, and scope/network constraints follow. The prose is dense and slightly run-on, but nearly every clause carries distinct information (which files, which CDN/API, which block lists, local execution, private-address refusal) rather than 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?
With no output schema, the description carries the burden of explaining return values, and it does not state what a result looks like (pass/fail per check, verdict format). However, it thoroughly covers input scope, network behavior, caching, and safety, leaving only the response shape as an unaddressed gap for this read-only diagnostic.
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% and the enum values (aasa/assetlinks/adblock) are already fully documented in the schema, including the default. The description mirrors that same mapping (aasa = iOS file + Apple CDN, assetlinks = Android + Google verdict, adblock = EasyPrivacy/AdGuard), so it adds little beyond the structured field. 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?
States a specific verb ('Checks') and resource ('a link domain') and then names the exact artifacts it validates: the apple-app-site-association file, assetlinks.json, Apple's CDN copy, Google's Digital Asset Links verdict, and EasyPrivacy/AdGuard block lists. This is unmistakably distinct from the sibling tools (list_links, create_link, search_docs), so an agent can select it without opening the schema.
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 scopes usage clearly: 'Works for any domain, not only DeepLinkNow's,' which tells the agent it is a general diagnostic rather than something tied to the account's own links. It also implies iOS/Android link-readiness is the target scenario. It stops short of explicitly naming alternatives or stating when not to use it, so it earns a solid 4 rather than 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_linkCreate a DeepLinkNow linkA
Creates a link in the app that DEEPLINKNOW_API_KEY (a private key) belongs to, with an optional custom path, link-page title and button texts, social preview, metadata and campaign. Creating links is optional: any path on the link domain already works. Use this for a custom preview or to group links in a campaign. Counts toward the plan's link limit. Needs a paid plan with management API access.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | Link page title. | |
| metadata | No | String key/value pairs returned to the app with the link. | |
| subtitle | No | Link page subtitle. | |
| target_url | Yes | Required by the API: an absolute URL stored as the link's target_url and returned to the app as targetUrl (for example the web page for the same content). Apps should route on the link's path and query, not on targetUrl. | |
| campaign_id | No | Add the link to this campaign (must be in the key's app). | |
| custom_path | No | The path on the link domain, e.g. "summer-sale" or "products/123?ref=email" (leading / optional, query sorted). It must pass the app's link path rule. Omit it for a random 8-character path. | |
| social_image | No | Social preview image URL. | |
| social_title | No | Social preview title. | |
| ios_button_text | No | Text of the App Store button on the link page. | |
| social_description | No | Social preview description. | |
| android_button_text | No | Text of the Play Store button on the link page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare the write profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false, openWorldHint=true), and the description adds real value beyond them: link-limit quota consumption and the paid-plan/management-API access requirement. It does not address what happens on a link-path-rule violation or that repeated calls create duplicate links (non-idempotency), which the annotations only imply numerically.
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?
Purpose is front-loaded in the first sentence, followed by escalating guidance (optionality, use case, cost, prerequisite). The sentences are long and information-dense but each carries a distinct fact; nothing reads as 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 an 11-parameter write tool with no output schema, the description covers purpose, when-to-use, cost and auth prerequisites well enough to call it correctly. It stops short of describing what the response contains (e.g. the generated path or link object), which is the one thing an agent cannot recover from the absent output schema.
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 every one of the 11 parameters is already documented in the schema, including formats, maxLengths and the path-rule constraint. The description only re-lists the field groups in prose without adding syntax or format meaning. Baseline 3 applies when 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?
States a specific verb and resource ("Creates a link in the app that DEEPLINKNOW_API_KEY ... belongs to") and enumerates the optional facets it can set (custom path, link-page title/button texts, social preview, metadata, campaign). This clearly separates it from read-side siblings such as list_links and search-side tools. An agent can identify the operation without opening the schema.
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 says when NOT to use it ("Creating links is optional: any path on the link domain already works") and when to use it ("for a custom preview or to group links in a campaign"). It also states prerequisites — paid plan with management API access — so the agent can pre-check feasibility.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
explain_match_resultExplain a deferred deep link matchARead-onlyIdempotent
Explains a DeepLinkNow fingerprint match: what confidence_score and match_quality (HIGH/MEDIUM/LOW) mean, which components (IP 40, device 30, time 20, locale 10) scored and why, and how to choose the SDK's minConfidence threshold. Pass the /sdk/match JSON, a DeferredDeepLink, or just a score. Works offline.
| Name | Required | Description | Default |
|---|---|---|---|
| result | No | Paste the JSON you want explained: a whole /api/v1/sdk/match response ({ matches, ttl_seconds }), one entry of its matches array, or the DeferredDeepLink that checkDeferredDeepLink returned (camelCase). | |
| source | No | The DeferredDeepLink's source, if known. | |
| confidence_score | No | Or just the score (0-100), if you don't have the JSON. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly/idempotent/non-destructive and closed-world, so the safety profile is covered. The description still adds behavioral context beyond that: it is a pure interpretive/offline operation that explains rather than computes, implying no network calls and deterministic output. It does not describe output format, but with annotations carrying the safety burden a 4 is warranted.
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?
Purpose and the decoded concepts are front-loaded in the first sentence, then two short sentences cover the accepted inputs and the offline trait. Every clause carries distinct information (what it explains, the inputs, the runtime behavior) 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?
There is no output schema, yet the description effectively previews the return content (meanings of score/quality, per-component breakdown, threshold guidance), which is exactly what an agent needs to know. Combined with the accepted input forms and the offline note, nothing needed to invoke and interpret it correctly is missing.
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 the schema already documents each field, so baseline would be 3. The description adds invocation value by clarifying the three inputs are alternatives — pass the /sdk/match JSON, a DeferredDeepLink, or just a score — which explains why no parameter is required and how to choose among them.
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 names a specific verb (explains) and a specific resource (a DeepLinkNow fingerprint match result), and enumerates exactly what it decodes: confidence_score, match_quality, component scoring, and minConfidence threshold selection. No sibling (get_setup_guide, search_docs, list_links, etc.) does anything comparable, so it is trivially distinguishable.
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?
It gives clear context for use (interpreting a match result and tuning the SDK's minConfidence threshold) and even states the operational condition 'works offline'. It does not explicitly state when *not* to use it or name an alternative, which keeps it 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.
get_setup_guideGet the DeepLinkNow setup guideARead-onlyIdempotent
Step-by-step setup and code for adding DeepLinkNow deferred deep linking to an iOS, Android, React Native, Expo or Flutter app: dashboard settings, SDK install, Associated Domains / App Links, initialize, checkDeferredDeepLink and handling links that open the installed app. Fetched live from deeplinknow.com's markdown docs, with a bundled copy when offline. Call this before writing integration code.
| Name | Required | Description | Default |
|---|---|---|---|
| platform | Yes | The app's platform. Use react-native for bare React Native, expo for Expo (development builds), flutter for Flutter (which calls the native SDKs through a platform channel). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld and non-destructive. The description adds genuinely new behavioral context: content is fetched live from deeplinknow.com with a bundled offline fallback, which tells the agent about network dependency and failure behavior. No auth or rate-limit details, but nothing contradicts the annotations.
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 with the content scope front-loaded and the imperative call-to-action last, so an agent gets the payload first. The topic enumeration is dense but every item is load-bearing for matching intent; 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?
A read-only, single-parameter tool with full schema coverage, an offline-fallback note, and no output schema to explain. Nothing needed to invoke it correctly is missing.
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% and the enum values carry their own descriptions (react-native vs expo vs flutter distinctions), so the schema does the heavy lifting. The description merely repeats the platform list already present in the enum, adding no syntax or semantics beyond it. Baseline 3 applies.
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?
States a specific verb (get) and resource (the DeepLinkNow setup guide) and enumerates the covered topics: dashboard settings, SDK install, Associated Domains/App Links, initialize, checkDeferredDeepLink. This clearly separates it from the generic sibling search_docs, which an agent would otherwise confuse it with.
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 closing line 'Call this before writing integration code' gives explicit timing guidance, which is strong. It stops short of naming alternatives or when-not-to-use conditions (e.g. search_docs for non-setup questions), so it is clear context rather than full routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_linksList DeepLinkNow linksARead-onlyIdempotent
Lists the deep links of the app that DEEPLINKNOW_API_KEY (a private key) belongs to, newest first, with their short URLs: links created in the dashboard or API, and on-demand links created when a path was first visited. Optional text search, campaign filter and paging. Needs a paid plan with management API access.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (with query; starts at 1). | |
| limit | No | How many links (1-100; default 50, or 20 with query). | |
| query | No | Text to find in the link's title, path or target URL (case-insensitive, literal). Uses the search endpoint. | |
| offset | No | Skip this many links (without query). | |
| url_path | No | Only the link with exactly this stored path (no leading /, query sorted). Can't be combined with query. | |
| campaign_id | No | Only links in this campaign. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/openWorld, so safety is covered; the description adds ordering semantics, the auth mechanism (private API key scoping to one app), the paid-plan requirement, and the fact that auto-generated on-demand links are included in results. It doesn't describe pagination limits or result volume, which the schema partly covers.
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 the verb and resource, then constraints and prerequisites. The clause enumerating link provenance is informative rather than padding, and nothing is redundant.
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 six-parameter, zero-required, read-only list tool with no output schema, the description covers identity, ordering, filtering, auth and plan gating. It could say more about what a returned link record contains (target, campaign, created date) since there is no output schema, which keeps it from a 5.
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% – every parameter (page, limit, query, offset, url_path, campaign_id) already carries its own constraints and semantics, including the query/url_path incompatibility. The description only restates 'optional text search, campaign filter and paging' without adding format or edge-case detail, so baseline 3 applies.
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?
States a specific verb and resource ('Lists the deep links of the app that DEEPLINKNOW_API_KEY belongs to') plus scope details: ordering (newest first), what a link contains (short URLs), and the two provenance types (dashboard/API-created vs on-demand from first path visit). This is unambiguously distinguishable from siblings like create_link, search_docs, or get_setup_guide.
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?
Gives a real prerequisite ('Needs a paid plan with management API access') and names the filtering levers (text search, campaign filter, paging), so an agent knows both the access gate and the narrowing options. It does not explicitly state when to prefer this over a sibling tool or when not to call it, so it falls short of the 5 bar.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
migrate_fromPlan a migration to DeepLinkNowARead-onlyIdempotent
A concrete plan and code diff for moving an app's deep linking from firebase-dynamic-links, branch, appsflyer, adjust to DeepLinkNow, for one platform: how to find the current integration, set up DeepLinkNow, map existing links, replace the code and verify. Attribution isn't migrated: DeepLinkNow does deep linking only.
| Name | Required | Description | Default |
|---|---|---|---|
| source | Yes | The deep linking product the app uses today. | |
| platform | Yes | The app's platform, for the code diff. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so the safety profile is covered. The description adds real behavioral context beyond that: the output is a plan plus a code diff, scope is scoped to a single platform, and attribution migration is explicitly out of scope.
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 front-loaded sentence with the deliverable ('plan and code diff') first and the step breakdown trailing as a compact list; nothing is wasted. It is dense but readable, with only mild fragmentation from the colon-and-comma step enumeration.
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?
With no output schema, the description must convey the return shape, and it does ('plan and code diff'). It also states the vendor scope and the attribution exclusion. The one soft ambiguity is that the listed steps ('replace the code and verify') could read as actions the tool performs, though readOnlyHint=true resolves that.
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% and both parameters are enums with descriptions, so the schema carries the semantics and 3 is the baseline. The description reinforces that 'platform' selects the variant the code diff targets and lists the accepted sources, but adds no format or behavior detail the schema lacks.
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 resource and deliverable ('a concrete plan and code diff' for moving deep linking to DeepLinkNow) and enumerates the four source vendors it accepts, so the agent knows exactly what it produces. The only weak spot is sibling differentiation: it says the plan includes 'set up DeepLinkNow', which is close enough to the sibling get_setup_guide that a routing note would have helped.
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?
Usage context is implied rather than stated: the source enum plus 'for one platform' tells the agent this applies only to apps currently on one of the four named vendors, and only one platform per call. There is no explicit when-to-use vs get_setup_guide/search_docs guidance and no stated prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_docsSearch the DeepLinkNow docsARead-onlyIdempotent
Keyword search across DeepLinkNow's full documentation (SDK docs for iOS, Android, React Native and Flutter, the integration checklist, pricing and comparisons). Returns the best-matching sections with their page URLs. Use it for specific questions such as error codes, options, plan limits or the paste prompt.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | What to look for, in words or identifiers, e.g. "minConfidence", "custom domain", "paste prompt", "Install Referrer". | |
| max_results | No | How many sections to return (1-10, default 5). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld and non-destructive, so safety is covered. The description adds genuinely new behavior: this is keyword (not semantic) search, and results are sections plus page URLs, which tells the agent the granularity of the response. It omits ranking/relevance behavior and any limits on result quality.
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?
Three sentences, front-loaded with the core action and scope, followed by return format and usage triggers. No filler or repetition of the tool name.
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?
With no output schema, the description usefully explains the return shape (matching sections with page URLs) and the content scope. An agent can call it correctly; only matching/ranking behavior and any caveats about coverage gaps are missing, which is a minor omission.
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%, and the schema already documents both query and max_results including examples and range. The description only restates the query intent at a high level, so the baseline 3 is appropriate; it adds no syntax or format detail 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?
States a specific verb (keyword search) and resource (the full documentation), and enumerates the scope: SDK docs for iOS/Android/React Native/Flutter, integration checklist, pricing and comparisons. It also states what comes back (best-matching sections with page URLs), which separates it from siblings like get_setup_guide or explain_match_result.
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?
Gives concrete when-to-use triggers (error codes, options, plan limits, paste prompt) that map to specific questions rather than browsing. It does not, however, name a sibling alternative or state when not to use it (e.g., use get_setup_guide for the full getting-started flow instead).
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.
7 tool updates
v1.0.1- First observed
check_domain - First observed
create_link - First observed
explain_match_result - First observed
get_setup_guide - First observed
list_links - First observed
migrate_from - First observed
search_docs
TDQS
Scored across 7 tools
Each tool targets a clearly distinct task: setup guide, keyword doc search, domain validation, fingerprint match explanation, migration planning, and link list/create. The only potential overlap between get_setup_guide and search_docs is resolved by their descriptions (guided integration vs. specific keyword lookup).
All names use snake_case with a leading verb, and most follow a verb_noun pattern. migrate_from is the lone deviation (verb + preposition rather than verb + noun), but it remains predictable and readable.
Seven tools is well-scoped for a server covering integration guidance, diagnostics, migration, and link management. Each tool earns its place without redundant utility operations.
Core integration workflows (setup, docs, domain checks, match explanation, migration) are covered. Link management is incomplete: create and list exist, but update and delete operations are missing, leaving a notable CRUD gap for the advertised management API.
Related MCP Connectors
Link infrastructure for developers and AI agents: deep links, attribution, real-time analytics.
Create, search and pause deep links; QR codes; analytics, taps, events; domains; webhooks.
Create branded short links and QR codes, and pull click analytics by country, device and referrer.
Affiliate & creator referral programs for mobile apps: SDK setup, campaigns, creators, analytics.
Related MCP Servers
- AlicenseAqualityBmaintenanceEnables AI assistants to manage ULink deep linking projects, including creating smart links, configuring domains, and viewing analytics.24122 npmMIT
- AlicenseAqualityDmaintenanceMCP server to configure and verify iOS Universal Links and Android App Links via DeepTap API, enabling coding agents to manage deep-link domains.65 npmMIT
- AlicenseCqualityAmaintenanceIt enables AI agents and command-line users to manage short links, analytics, conversions, partner workflows, commissions, payouts, and private workspace profiles with explicit write controls and exact reviewed batch submissions.6117 npmAGPL 3.0

esyURL MCP serverofficial
AlicenseNot gradedqualityCmaintenanceEnables AI agents to create, update, organize, and delete short links; render styled QR codes; route visitors by device or country; and read click and scan statistics. Agents can also manage groups and custom domains while changing destinations without breaking printed QR codes or shared short URLs.MIT