deeptap-mcp 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 DeepTap
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,57 @@
1
+ # deeptap-mcp
2
+
3
+ MCP server for [DeepTap](https://deeptap.io) — configure iOS Universal Links and Android App Links, and verify them, directly from your coding agent (Claude Code, etc.).
4
+
5
+ It's a thin wrapper over the DeepTap public REST API: each tool is one API call. Point your agent at it, and it can create a deep-link domain, wire up the iOS/Android config, and run a pre-flight check on the generated `apple-app-site-association` and `assetlinks.json` files.
6
+
7
+ ## Install
8
+
9
+ Get an API key from **Dashboard → Settings → API Keys** at <https://deeptap.io/dashboard/settings>, then add the server:
10
+
11
+ ```bash
12
+ claude mcp add --scope user --transport stdio deeptap \
13
+ --env DEEPTAP_API_KEY=dt_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx \
14
+ -- npx -y deeptap-mcp
15
+ ```
16
+
17
+ Or run it directly: `DEEPTAP_API_KEY=dt_live_… npx -y deeptap-mcp`.
18
+
19
+ ## Configuration
20
+
21
+ | Env var | Required | Default | Description |
22
+ |---|---|---|---|
23
+ | `DEEPTAP_API_KEY` | yes | — | API key (`dt_live_…`), sent as `Authorization: Bearer`. |
24
+ | `DEEPTAP_API_URL` | no | `https://deeptap.io` | Base URL of the DeepTap API (override for self-hosting/staging). |
25
+
26
+ ## Tools
27
+
28
+ | Tool | API call | Purpose |
29
+ |---|---|---|
30
+ | `get_account` | `GET /me` | Account, plan, and live limits. Call first to check capacity. |
31
+ | `list_domains` | `GET /domains` | All domains with their iOS/Android config and file URLs. |
32
+ | `get_domain` | `GET /domains/:id` | One domain by id (e.g. `dom_42`). |
33
+ | `create_domain` | `POST /domains` | Create a subdomain and configure iOS/Android. |
34
+ | `update_domain` | `PUT /domains/:id` | Partial update of iOS/Android config. |
35
+ | `verify_domain` | `GET /domains/:id/verify` | Pre-flight: fetch and validate AASA + assetlinks. |
36
+
37
+ Every response includes a `meta` block with the plan, domain/link usage, and rate-limit state — the agent reads it to report limits.
38
+
39
+ ### Typical flow
40
+
41
+ 1. `get_account` — check the plan and how many domains are available.
42
+ 2. `create_domain` — `{ "name": "myapp", "ios": { "team_id": "ABCDE12345", "bundle_id": "com.example.myapp", "paths": ["*"], "fallback_url": "https://example.com" }, "android": { "package_name": "com.example.myapp", "sha256_fingerprints": ["AA:BB:…"] } }`
43
+ 3. `verify_domain` — confirm the generated files are reachable and match the app identifiers.
44
+
45
+ `verify_domain` checks everything verifiable server-side (file reachability, JSON validity, `appID`/package match, fingerprints, paths). Rebuilding the app and on-device checks are still required — the agent should also confirm `associatedDomains` / package config in your project (`app.json`, Xcode).
46
+
47
+ ## Development
48
+
49
+ ```bash
50
+ npm install
51
+ npm run build # tsc -> dist/
52
+ npm start # run the built server on stdio
53
+ ```
54
+
55
+ ## License
56
+
57
+ MIT
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Thin HTTP client for the DeepTap public API (/api/v1). Every MCP tool maps to
3
+ * exactly one request here. No app code is shared — the server only speaks the
4
+ * public REST contract.
5
+ */
6
+ export interface ApiResponse {
7
+ status: number;
8
+ /** Parsed JSON body, or undefined for 204 / empty responses. */
9
+ body: unknown;
10
+ }
11
+ export declare class DeepTapClient {
12
+ private readonly apiKey;
13
+ private readonly baseUrl;
14
+ constructor(apiKey: string, baseUrl?: string);
15
+ private request;
16
+ get(path: string): Promise<ApiResponse>;
17
+ post(path: string, body: unknown): Promise<ApiResponse>;
18
+ put(path: string, body: unknown): Promise<ApiResponse>;
19
+ delete(path: string): Promise<ApiResponse>;
20
+ }
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Thin HTTP client for the DeepTap public API (/api/v1). Every MCP tool maps to
3
+ * exactly one request here. No app code is shared — the server only speaks the
4
+ * public REST contract.
5
+ */
6
+ const DEFAULT_BASE_URL = "https://deeptap.io";
7
+ export class DeepTapClient {
8
+ apiKey;
9
+ baseUrl;
10
+ constructor(apiKey, baseUrl = process.env.DEEPTAP_API_URL || DEFAULT_BASE_URL) {
11
+ this.apiKey = apiKey;
12
+ this.baseUrl = baseUrl.replace(/\/+$/, "");
13
+ }
14
+ async request(method, path, body) {
15
+ const res = await fetch(`${this.baseUrl}/api/v1${path}`, {
16
+ method,
17
+ headers: {
18
+ Authorization: `Bearer ${this.apiKey}`,
19
+ "Content-Type": "application/json",
20
+ Accept: "application/json",
21
+ },
22
+ body: body !== undefined ? JSON.stringify(body) : undefined,
23
+ });
24
+ const text = await res.text();
25
+ let parsed = undefined;
26
+ if (text) {
27
+ try {
28
+ parsed = JSON.parse(text);
29
+ }
30
+ catch {
31
+ parsed = { raw: text };
32
+ }
33
+ }
34
+ return { status: res.status, body: parsed };
35
+ }
36
+ get(path) {
37
+ return this.request("GET", path);
38
+ }
39
+ post(path, body) {
40
+ return this.request("POST", path, body);
41
+ }
42
+ put(path, body) {
43
+ return this.request("PUT", path, body);
44
+ }
45
+ delete(path) {
46
+ return this.request("DELETE", path);
47
+ }
48
+ }
49
+ //# sourceMappingURL=api-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-client.js","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,gBAAgB,GAAG,oBAAoB,CAAC;AAQ9C,MAAM,OAAO,aAAa;IAIL;IAHF,OAAO,CAAS;IAEjC,YACmB,MAAc,EAC/B,UAAkB,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,gBAAgB;QADhD,WAAM,GAAN,MAAM,CAAQ;QAG/B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC7C,CAAC;IAEO,KAAK,CAAC,OAAO,CAAC,MAAc,EAAE,IAAY,EAAE,IAAc;QAChE,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,UAAU,IAAI,EAAE,EAAE;YACvD,MAAM;YACN,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;gBACtC,cAAc,EAAE,kBAAkB;gBAClC,MAAM,EAAE,kBAAkB;aAC3B;YACD,IAAI,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;SAC5D,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,IAAI,MAAM,GAAY,SAAS,CAAC;QAChC,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC;gBACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC5B,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;YACzB,CAAC;QACH,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC9C,CAAC;IAED,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACnC,CAAC;IACD,IAAI,CAAC,IAAY,EAAE,IAAa;QAC9B,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC1C,CAAC;IACD,GAAG,CAAC,IAAY,EAAE,IAAa;QAC7B,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACzC,CAAC;IACD,MAAM,CAAC,IAAY;QACjB,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACtC,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,112 @@
1
+ #!/usr/bin/env node
2
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
4
+ import { z } from "zod";
5
+ import { DeepTapClient } from "./api-client.js";
6
+ const API_KEY = process.env.DEEPTAP_API_KEY;
7
+ function text(value) {
8
+ return { content: [{ type: "text", text: typeof value === "string" ? value : JSON.stringify(value, null, 2) }] };
9
+ }
10
+ function missingKey() {
11
+ return {
12
+ isError: true,
13
+ content: [
14
+ {
15
+ type: "text",
16
+ text: "DEEPTAP_API_KEY is not set. Create a key at https://deeptap.io/dashboard/settings and pass it via the DEEPTAP_API_KEY environment variable.",
17
+ },
18
+ ],
19
+ };
20
+ }
21
+ /**
22
+ * Turn an API response into a tool result. Success returns the full body
23
+ * (so the agent can read `data` and the `meta` block with plan/limits/rate_limit);
24
+ * non-2xx is surfaced as an error with the API's error envelope.
25
+ */
26
+ function toResult(res) {
27
+ if (res.status === 204)
28
+ return text({ ok: true });
29
+ const result = text(res.body ?? { status: res.status });
30
+ if (res.status < 200 || res.status >= 300)
31
+ result.isError = true;
32
+ return result;
33
+ }
34
+ async function run(fn) {
35
+ if (!API_KEY)
36
+ return missingKey();
37
+ try {
38
+ return toResult(await fn(new DeepTapClient(API_KEY)));
39
+ }
40
+ catch (err) {
41
+ return { isError: true, content: [{ type: "text", text: `Request failed: ${err instanceof Error ? err.message : String(err)}` }] };
42
+ }
43
+ }
44
+ // ---- shared input shapes (snake_case, matching the REST API) ------------------
45
+ const iosCreate = {
46
+ team_id: z.string().describe("Apple Team ID (10 chars)"),
47
+ bundle_id: z.string().describe("App bundle identifier, e.g. com.example.app"),
48
+ paths: z.array(z.string()).optional().describe("Universal-link path patterns (default ['*'])"),
49
+ exclude_patterns: z.array(z.string()).optional(),
50
+ fallback_url: z.string().optional().describe("HTTPS URL when the app is not installed"),
51
+ app_store_url: z.string().optional().describe("HTTPS App Store URL"),
52
+ enable_web_credentials: z.boolean().optional(),
53
+ };
54
+ const androidCreate = {
55
+ package_name: z.string().describe("Android package name, e.g. com.example.app"),
56
+ sha256_fingerprints: z.array(z.string()).describe("SHA-256 signing-cert fingerprints"),
57
+ namespace: z.string().optional(),
58
+ play_store_url: z.string().optional().describe("HTTPS Play Store URL"),
59
+ };
60
+ const iosUpdate = Object.fromEntries(Object.entries(iosCreate).map(([k, v]) => [k, v.optional()]));
61
+ const androidUpdate = Object.fromEntries(Object.entries(androidCreate).map(([k, v]) => [k, v.optional()]));
62
+ // ---- server ------------------------------------------------------------------
63
+ const server = new McpServer({ name: "deeptap-mcp", version: "0.1.0" });
64
+ server.registerTool("get_account", {
65
+ title: "Get DeepTap account",
66
+ description: "Return the current DeepTap account, plan, and limits. Call this first to check the plan and how many domains/links are available before creating resources. Read the `meta` block for live usage and rate limits.",
67
+ inputSchema: {},
68
+ }, () => run((c) => c.get("/me")));
69
+ server.registerTool("list_domains", {
70
+ title: "List domains",
71
+ description: "List all DeepTap domains for the account, with their iOS/Android config and AASA/assetlinks URLs.",
72
+ inputSchema: {},
73
+ }, () => run((c) => c.get("/domains")));
74
+ server.registerTool("get_domain", {
75
+ title: "Get domain",
76
+ description: "Fetch one domain by id (e.g. 'dom_42'), including its iOS/Android settings and generated file URLs.",
77
+ inputSchema: { id: z.string().describe("Domain id, e.g. dom_42") },
78
+ }, ({ id }) => run((c) => c.get(`/domains/${encodeURIComponent(id)}`)));
79
+ server.registerTool("create_domain", {
80
+ title: "Create domain",
81
+ description: "Create a DeepTap subdomain and configure iOS Universal Links and/or Android App Links. Pass `name` (the subdomain label, e.g. 'myapp' → myapp.deeptap.io). For working routing also set fallback_url and app_store_url / play_store_url. After creating, call verify_domain.",
82
+ inputSchema: {
83
+ name: z.string().describe("Subdomain label, e.g. 'myapp' for myapp.deeptap.io"),
84
+ ios: z.object(iosCreate).optional(),
85
+ android: z.object(androidCreate).optional(),
86
+ },
87
+ }, ({ name, ios, android }) => run((c) => c.post("/domains", { name, ios, android })));
88
+ server.registerTool("update_domain", {
89
+ title: "Update domain",
90
+ description: "Update a domain's iOS/Android configuration (partial — only the fields you pass change). iOS caches AASA aggressively; existing installs may take up to 24h to pick up changes.",
91
+ inputSchema: {
92
+ id: z.string().describe("Domain id, e.g. dom_42"),
93
+ ios: z.object(iosUpdate).optional(),
94
+ android: z.object(androidUpdate).optional(),
95
+ },
96
+ }, ({ id, ios, android }) => run((c) => c.put(`/domains/${encodeURIComponent(id)}`, { ios, android })));
97
+ server.registerTool("verify_domain", {
98
+ title: "Verify domain (pre-flight)",
99
+ description: "Fetch the domain's generated apple-app-site-association and assetlinks.json and check them against the configured app identifiers (reachable, valid JSON, appID/package match, fingerprints, paths). Run after create_domain/update_domain. Note: this checks what is verifiable server-side; rebuilding the app and on-device checks are still required.",
100
+ inputSchema: { id: z.string().describe("Domain id, e.g. dom_42") },
101
+ }, ({ id }) => run((c) => c.get(`/domains/${encodeURIComponent(id)}/verify`)));
102
+ async function main() {
103
+ const transport = new StdioServerTransport();
104
+ await server.connect(transport);
105
+ // stderr only — stdout is the MCP transport channel.
106
+ console.error("deeptap-mcp running on stdio");
107
+ }
108
+ main().catch((err) => {
109
+ console.error("Fatal:", err);
110
+ process.exit(1);
111
+ });
112
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "deeptap-mcp",
3
+ "version": "0.1.0",
4
+ "description": "MCP server for DeepTap — configure iOS Universal Links / Android App Links and verify them from your coding agent.",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "bin": {
8
+ "deeptap-mcp": "dist/index.js"
9
+ },
10
+ "files": [
11
+ "dist"
12
+ ],
13
+ "engines": {
14
+ "node": ">=18"
15
+ },
16
+ "keywords": [
17
+ "mcp",
18
+ "model-context-protocol",
19
+ "deeptap",
20
+ "deep-links",
21
+ "universal-links",
22
+ "app-links",
23
+ "ios",
24
+ "android"
25
+ ],
26
+ "scripts": {
27
+ "build": "tsc",
28
+ "dev": "tsc --watch",
29
+ "start": "node dist/index.js",
30
+ "prepublishOnly": "npm run build"
31
+ },
32
+ "dependencies": {
33
+ "@modelcontextprotocol/sdk": "^1.13.0",
34
+ "zod": "^3.25.0"
35
+ },
36
+ "devDependencies": {
37
+ "@types/node": "^22.0.0",
38
+ "typescript": "^5.6.0"
39
+ }
40
+ }