@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 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 | Description |
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-brasil) or [request a tool](https://github.com/codespar/mcp-dev-brasil/issues).
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 Brasil](https://github.com/codespar/mcp-dev-brasil)
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
- const server = new Server({ name: "mcp-rd-station", version: "0.2.0" }, { capabilities: { tools: {} } });
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.0" }, { capabilities: { tools: {} } });
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@codespar/mcp-rd-station",
3
- "version": "0.2.0",
3
+ "version": "0.2.2",
4
4
  "description": "MCP server for RD Station — contacts, events, funnels, deals, segmentations, lead scoring, webhooks",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
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-brasil",
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.0",
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.0",
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 8 tools", async () => {
35
+ it("should register 18 tools", async () => {
36
36
  const result = await listToolsHandler();
37
- expect(result.tools).toHaveLength(8);
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.0" },
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.0" }, { 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);
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 });