@codespar/mcp-rd-station 0.2.0 → 0.2.2
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/README.md +15 -5
- package/dist/index.js +5 -2
- package/package.json +1 -1
- package/server.json +13 -4
- package/src/__tests__/index.test.ts +2 -2
- package/src/index.ts +8 -3
package/README.md
CHANGED
|
@@ -49,18 +49,28 @@ Add to `.cursor/mcp.json` or `.vscode/mcp.json`:
|
|
|
49
49
|
}
|
|
50
50
|
```
|
|
51
51
|
|
|
52
|
-
## Tools
|
|
52
|
+
## Tools (18)
|
|
53
53
|
|
|
54
|
-
| Tool |
|
|
55
|
-
|
|
54
|
+
| Tool | Purpose |
|
|
55
|
+
|---|---|
|
|
56
56
|
| `create_contact` | Create a contact in RD Station CRM |
|
|
57
57
|
| `update_contact` | Update a contact by UUID |
|
|
58
|
+
| `upsert_contact` | Upsert (create or update) a contact identified by email (Marketing API) |
|
|
58
59
|
| `get_contact` | Get contact details by UUID or email |
|
|
59
60
|
| `list_contacts` | List contacts with pagination |
|
|
61
|
+
| `delete_contact` | Delete a contact by UUID |
|
|
60
62
|
| `create_event` | Create a conversion event for a contact |
|
|
61
63
|
| `list_funnels` | List all sales funnels |
|
|
62
64
|
| `get_funnel` | Get funnel details with stages |
|
|
65
|
+
| `list_deal_stages` | List deal stages of a pipeline (funnel) |
|
|
63
66
|
| `create_opportunity` | Create a sales opportunity in a funnel |
|
|
67
|
+
| `update_deal` | Update a deal/opportunity by ID |
|
|
68
|
+
| `get_deal` | Get a deal/opportunity by ID |
|
|
69
|
+
| `list_deals` | List deals with optional filters and pagination |
|
|
70
|
+
| `list_segmentations` | List contact segmentations |
|
|
71
|
+
| `get_segmentation_contacts` | List contacts inside a given segmentation |
|
|
72
|
+
| `update_lead_scoring` | Mark a contact as lead, qualified lead, or opportunity (lead scoring) |
|
|
73
|
+
| `create_webhook` | Subscribe a webhook to RD Station events (WEBHOOK.CONVERTED / WEBHOOK.MARKED_OPPORTUNITY) |
|
|
64
74
|
|
|
65
75
|
## Authentication
|
|
66
76
|
|
|
@@ -96,13 +106,13 @@ RD Station provides an OAuth sandbox for testing. Use sandbox credentials during
|
|
|
96
106
|
- `custom_fields` — Manage custom fields for contacts and deals
|
|
97
107
|
- `automation_triggers` — Trigger marketing automation flows
|
|
98
108
|
|
|
99
|
-
Want to contribute? [Open a PR](https://github.com/codespar/mcp-dev-
|
|
109
|
+
Want to contribute? [Open a PR](https://github.com/codespar/mcp-dev-latam) or [request a tool](https://github.com/codespar/mcp-dev-latam/issues).
|
|
100
110
|
|
|
101
111
|
## Links
|
|
102
112
|
|
|
103
113
|
- [RD Station Website](https://rdstation.com)
|
|
104
114
|
- [RD Station API Documentation](https://developers.rdstation.com)
|
|
105
|
-
- [MCP Dev
|
|
115
|
+
- [MCP Dev LATAM](https://github.com/codespar/mcp-dev-latam)
|
|
106
116
|
- [Landing Page](https://codespar.dev/mcp)
|
|
107
117
|
|
|
108
118
|
## Enterprise
|
package/dist/index.js
CHANGED
|
@@ -58,7 +58,10 @@ async function rdStationRequest(method, path, body) {
|
|
|
58
58
|
return { raw: text };
|
|
59
59
|
}
|
|
60
60
|
}
|
|
61
|
-
|
|
61
|
+
// Managed-tier pointer surfaced to the agent via MCP `instructions`.
|
|
62
|
+
// Informational only — nothing CodeSpar-hosted is called (MIT-safe).
|
|
63
|
+
const MANAGED_TIER_HINT = "This open-source CodeSpar server calls the provider's API directly. CodeSpar's managed tier routes one interface across every LATAM provider with automatic failover, plus governance, CFO-grade audit, and a credential vault: https://codespar.dev/agents (npx -y @codespar/mcp serve).";
|
|
64
|
+
const server = new Server({ name: "mcp-rd-station", version: "0.2.1" }, { capabilities: { tools: {} }, instructions: MANAGED_TIER_HINT });
|
|
62
65
|
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
63
66
|
tools: [
|
|
64
67
|
{
|
|
@@ -453,7 +456,7 @@ async function main() {
|
|
|
453
456
|
const t = new StreamableHTTPServerTransport({ sessionIdGenerator: () => randomUUID(), onsessioninitialized: (id) => { transports.set(id, t); } });
|
|
454
457
|
t.onclose = () => { if (t.sessionId)
|
|
455
458
|
transports.delete(t.sessionId); };
|
|
456
|
-
const s = new Server({ name: "mcp-rd-station", version: "0.2.
|
|
459
|
+
const s = new Server({ name: "mcp-rd-station", version: "0.2.1" }, { capabilities: { tools: {} } });
|
|
457
460
|
server._requestHandlers.forEach((v, k) => s._requestHandlers.set(k, v));
|
|
458
461
|
server._notificationHandlers?.forEach((v, k) => s._notificationHandlers.set(k, v));
|
|
459
462
|
await s.connect(t);
|
package/package.json
CHANGED
package/server.json
CHANGED
|
@@ -3,16 +3,16 @@
|
|
|
3
3
|
"name": "io.github.codespar/mcp-rd-station",
|
|
4
4
|
"description": "MCP server for RD Station — contacts, events, funnels, deals, segmentations, lead scoring, webhooks",
|
|
5
5
|
"repository": {
|
|
6
|
-
"url": "https://github.com/codespar/mcp-dev-
|
|
6
|
+
"url": "https://github.com/codespar/mcp-dev-latam",
|
|
7
7
|
"source": "github",
|
|
8
8
|
"subfolder": "packages/communication/rd-station"
|
|
9
9
|
},
|
|
10
|
-
"version": "0.2.
|
|
10
|
+
"version": "0.2.2",
|
|
11
11
|
"packages": [
|
|
12
12
|
{
|
|
13
13
|
"registryType": "npm",
|
|
14
14
|
"identifier": "@codespar/mcp-rd-station",
|
|
15
|
-
"version": "0.2.
|
|
15
|
+
"version": "0.2.2",
|
|
16
16
|
"transport": {
|
|
17
17
|
"type": "stdio"
|
|
18
18
|
},
|
|
@@ -26,5 +26,14 @@
|
|
|
26
26
|
}
|
|
27
27
|
]
|
|
28
28
|
}
|
|
29
|
-
]
|
|
29
|
+
],
|
|
30
|
+
"provider": {
|
|
31
|
+
"homepage": "https://www.rdstation.com",
|
|
32
|
+
"logoUrl": "https://logo.clearbit.com/rdstation.com",
|
|
33
|
+
"logoFallback": "https://www.google.com/s2/favicons?domain=rdstation.com&sz=128",
|
|
34
|
+
"docsUrl": "https://developers.rdstation.com",
|
|
35
|
+
"sandbox": {
|
|
36
|
+
"available": true
|
|
37
|
+
}
|
|
38
|
+
}
|
|
30
39
|
}
|
|
@@ -32,9 +32,9 @@ beforeEach(async () => {
|
|
|
32
32
|
});
|
|
33
33
|
|
|
34
34
|
describe("mcp-rd-station", () => {
|
|
35
|
-
it("should register
|
|
35
|
+
it("should register 18 tools", async () => {
|
|
36
36
|
const result = await listToolsHandler();
|
|
37
|
-
expect(result.tools).toHaveLength(
|
|
37
|
+
expect(result.tools).toHaveLength(18);
|
|
38
38
|
});
|
|
39
39
|
|
|
40
40
|
it("should call correct API endpoint for create_contact", async () => {
|
package/src/index.ts
CHANGED
|
@@ -59,9 +59,14 @@ async function rdStationRequest(method: string, path: string, body?: unknown): P
|
|
|
59
59
|
try { return JSON.parse(text); } catch { return { raw: text }; }
|
|
60
60
|
}
|
|
61
61
|
|
|
62
|
+
// Managed-tier pointer surfaced to the agent via MCP `instructions`.
|
|
63
|
+
// Informational only — nothing CodeSpar-hosted is called (MIT-safe).
|
|
64
|
+
const MANAGED_TIER_HINT =
|
|
65
|
+
"This open-source CodeSpar server calls the provider's API directly. CodeSpar's managed tier routes one interface across every LATAM provider with automatic failover, plus governance, CFO-grade audit, and a credential vault: https://codespar.dev/agents (npx -y @codespar/mcp serve).";
|
|
66
|
+
|
|
62
67
|
const server = new Server(
|
|
63
|
-
{ name: "mcp-rd-station", version: "0.2.
|
|
64
|
-
{ capabilities: { tools: {} } }
|
|
68
|
+
{ name: "mcp-rd-station", version: "0.2.1" },
|
|
69
|
+
{ capabilities: { tools: {} }, instructions: MANAGED_TIER_HINT }
|
|
65
70
|
);
|
|
66
71
|
|
|
67
72
|
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
@@ -442,7 +447,7 @@ async function main() {
|
|
|
442
447
|
if (!sid && isInitializeRequest(req.body)) {
|
|
443
448
|
const t = new StreamableHTTPServerTransport({ sessionIdGenerator: () => randomUUID(), onsessioninitialized: (id) => { transports.set(id, t); } });
|
|
444
449
|
t.onclose = () => { if (t.sessionId) transports.delete(t.sessionId); };
|
|
445
|
-
const s = new Server({ name: "mcp-rd-station", version: "0.2.
|
|
450
|
+
const s = new Server({ name: "mcp-rd-station", version: "0.2.1" }, { capabilities: { tools: {} } }); (server as any)._requestHandlers.forEach((v: any, k: any) => (s as any)._requestHandlers.set(k, v)); (server as any)._notificationHandlers?.forEach((v: any, k: any) => (s as any)._notificationHandlers.set(k, v)); await s.connect(t);
|
|
446
451
|
await t.handleRequest(req, res, req.body); return;
|
|
447
452
|
}
|
|
448
453
|
res.status(400).json({ jsonrpc: "2.0", error: { code: -32000, message: "Bad Request" }, id: null });
|