grantsignal-mcp 1.0.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.
Files changed (46) hide show
  1. package/README.md +61 -0
  2. package/dist/client.d.ts +7 -0
  3. package/dist/client.d.ts.map +1 -0
  4. package/dist/client.js +34 -0
  5. package/dist/client.js.map +1 -0
  6. package/dist/config.d.ts +13 -0
  7. package/dist/config.d.ts.map +1 -0
  8. package/dist/config.js +14 -0
  9. package/dist/config.js.map +1 -0
  10. package/dist/http.d.ts +18 -0
  11. package/dist/http.d.ts.map +1 -0
  12. package/dist/http.js +173 -0
  13. package/dist/http.js.map +1 -0
  14. package/dist/index.d.ts +16 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +27 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/server.d.ts +9 -0
  19. package/dist/server.d.ts.map +1 -0
  20. package/dist/server.js +534 -0
  21. package/dist/server.js.map +1 -0
  22. package/dist/tools/deadlines.d.ts +20 -0
  23. package/dist/tools/deadlines.d.ts.map +1 -0
  24. package/dist/tools/deadlines.js +57 -0
  25. package/dist/tools/deadlines.js.map +1 -0
  26. package/dist/tools/details.d.ts +26 -0
  27. package/dist/tools/details.d.ts.map +1 -0
  28. package/dist/tools/details.js +71 -0
  29. package/dist/tools/details.js.map +1 -0
  30. package/dist/tools/funder.d.ts +26 -0
  31. package/dist/tools/funder.d.ts.map +1 -0
  32. package/dist/tools/funder.js +74 -0
  33. package/dist/tools/funder.js.map +1 -0
  34. package/dist/tools/search.d.ts +26 -0
  35. package/dist/tools/search.d.ts.map +1 -0
  36. package/dist/tools/search.js +76 -0
  37. package/dist/tools/search.js.map +1 -0
  38. package/dist/tools/sources.d.ts +15 -0
  39. package/dist/tools/sources.d.ts.map +1 -0
  40. package/dist/tools/sources.js +47 -0
  41. package/dist/tools/sources.js.map +1 -0
  42. package/dist/types.d.ts +181 -0
  43. package/dist/types.d.ts.map +1 -0
  44. package/dist/types.js +5 -0
  45. package/dist/types.js.map +1 -0
  46. package/package.json +48 -0
package/README.md ADDED
@@ -0,0 +1,61 @@
1
+ # grantsignal-mcp-server
2
+
3
+ The most comprehensive US grant intelligence MCP server. Federal + NYC + NYS + NJ in one call.
4
+
5
+ ## Quick Start
6
+
7
+ Add to your `claude_desktop_config.json`:
8
+
9
+ ```json
10
+ {
11
+ "mcpServers": {
12
+ "grantsignal": {
13
+ "command": "npx",
14
+ "args": ["-y", "grantsignal-mcp-server"]
15
+ }
16
+ }
17
+ }
18
+ ```
19
+
20
+ Restart Claude Desktop. Done.
21
+
22
+ ## Free Tools (no API key needed)
23
+
24
+ | Tool | Description |
25
+ |------|-------------|
26
+ | `grants_search` | Search grants by keyword, agency, status, geography, amount, deadline |
27
+ | `grants_get_details` | Full grant details with description, eligibility, funding info |
28
+ | `grants_list_deadlines` | Upcoming deadlines sorted chronologically |
29
+ | `grants_funder_profile` | Agency profiles with award ranges and focus areas |
30
+ | `grants_list_sources` | Data source health and sync status |
31
+
32
+ ## Developer Tools ($49/mo)
33
+
34
+ | Tool | Description |
35
+ |------|-------------|
36
+ | `grants_match` | AI-powered matching against your org profile |
37
+
38
+ ## Data Sources
39
+
40
+ - **Grants.gov** (Federal) - syncs every 6 hours
41
+ - **NYC CROL** (City Record Online) - daily
42
+ - **NYC PASSPort** (Procurement) - hourly during business hours
43
+ - **NYS Grants Gateway** - every 12 hours
44
+ - **NJ SAGE** - every 12 hours
45
+
46
+ ## Environment Variables
47
+
48
+ ```bash
49
+ GRANTSIGNAL_API_URL # Override API endpoint (optional)
50
+ GRANTSIGNAL_API_KEY # API key for paid features (optional)
51
+ ```
52
+
53
+ ## Links
54
+
55
+ - Website: [grantsignal.dev](https://grantsignal.dev)
56
+ - GitHub: [github.com/jwk100-labs/grant-signal](https://github.com/jwk100-labs/grant-signal)
57
+ - npm: [grantsignal-mcp-server](https://npmjs.com/package/grantsignal-mcp-server)
58
+
59
+ ## License
60
+
61
+ MIT
@@ -0,0 +1,7 @@
1
+ /**
2
+ * GrantSignal MCP Server — HTTP Client
3
+ *
4
+ * Thin fetch wrapper for calling Convex HTTP actions.
5
+ */
6
+ export declare function apiCall<T>(endpoint: string, body?: Record<string, unknown>): Promise<T>;
7
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,wBAAsB,OAAO,CAAC,CAAC,EAC7B,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACjC,OAAO,CAAC,CAAC,CAAC,CA8BZ"}
package/dist/client.js ADDED
@@ -0,0 +1,34 @@
1
+ /**
2
+ * GrantSignal MCP Server — HTTP Client
3
+ *
4
+ * Thin fetch wrapper for calling Convex HTTP actions.
5
+ */
6
+ import { config } from "./config.js";
7
+ export async function apiCall(endpoint, body = {}) {
8
+ const url = `${config.apiUrl}/api/grantsignal/${endpoint}`;
9
+ const headers = {
10
+ "Content-Type": "application/json",
11
+ };
12
+ if (config.apiKey) {
13
+ headers["Authorization"] = `Bearer ${config.apiKey}`;
14
+ }
15
+ const resp = await fetch(url, {
16
+ method: "POST",
17
+ headers,
18
+ body: JSON.stringify(body),
19
+ });
20
+ if (!resp.ok) {
21
+ const text = await resp.text();
22
+ let message;
23
+ try {
24
+ const json = JSON.parse(text);
25
+ message = json.error || text;
26
+ }
27
+ catch {
28
+ message = text;
29
+ }
30
+ throw new Error(`GrantSignal API error (${resp.status}): ${message}`);
31
+ }
32
+ return (await resp.json());
33
+ }
34
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,QAAgB,EAChB,OAAgC,EAAE;IAElC,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,MAAM,oBAAoB,QAAQ,EAAE,CAAC;IAE3D,MAAM,OAAO,GAA2B;QACtC,cAAc,EAAE,kBAAkB;KACnC,CAAC;IAEF,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,MAAM,CAAC,MAAM,EAAE,CAAC;IACvD,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAC5B,MAAM,EAAE,MAAM;QACd,OAAO;QACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;KAC3B,CAAC,CAAC;IAEH,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACb,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAC/B,IAAI,OAAe,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC9B,OAAO,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,CAAC,MAAM,MAAM,OAAO,EAAE,CAAC,CAAC;IACxE,CAAC;IAED,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAM,CAAC;AAClC,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * GrantSignal MCP Server — Configuration
3
+ *
4
+ * Reads API URL and optional API key from environment variables.
5
+ * Falls back to the production Convex deployment.
6
+ */
7
+ export declare const config: {
8
+ /** Base URL for the Convex HTTP actions */
9
+ apiUrl: string;
10
+ /** Optional API key for authenticated (paid) endpoints */
11
+ apiKey: string | undefined;
12
+ };
13
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,MAAM;IACjB,2CAA2C;;IAK3C,0DAA0D;;CAE3D,CAAC"}
package/dist/config.js ADDED
@@ -0,0 +1,14 @@
1
+ /**
2
+ * GrantSignal MCP Server — Configuration
3
+ *
4
+ * Reads API URL and optional API key from environment variables.
5
+ * Falls back to the production Convex deployment.
6
+ */
7
+ export const config = {
8
+ /** Base URL for the Convex HTTP actions */
9
+ apiUrl: process.env.GRANTSIGNAL_API_URL ||
10
+ "https://wooden-coyote-415.convex.site",
11
+ /** Optional API key for authenticated (paid) endpoints */
12
+ apiKey: process.env.GRANTSIGNAL_API_KEY || undefined,
13
+ };
14
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,2CAA2C;IAC3C,MAAM,EACJ,OAAO,CAAC,GAAG,CAAC,mBAAmB;QAC/B,uCAAuC;IAEzC,0DAA0D;IAC1D,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,SAAS;CACrD,CAAC"}
package/dist/http.d.ts ADDED
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * GrantSignal MCP Server — Streamable HTTP entry point
4
+ *
5
+ * Exposes the MCP server over HTTP for remote clients like ChatGPT.
6
+ * Uses the Streamable HTTP transport from the MCP SDK with Node's built-in http module.
7
+ *
8
+ * Usage:
9
+ * node dist/http.js
10
+ * PORT=3001 node dist/http.js
11
+ *
12
+ * Environment variables:
13
+ * PORT — HTTP port (default 3001)
14
+ * GRANTSIGNAL_API_URL — Override the default API endpoint
15
+ * GRANTSIGNAL_API_KEY — API key for paid tier features
16
+ */
17
+ export {};
18
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;GAcG"}
package/dist/http.js ADDED
@@ -0,0 +1,173 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * GrantSignal MCP Server — Streamable HTTP entry point
4
+ *
5
+ * Exposes the MCP server over HTTP for remote clients like ChatGPT.
6
+ * Uses the Streamable HTTP transport from the MCP SDK with Node's built-in http module.
7
+ *
8
+ * Usage:
9
+ * node dist/http.js
10
+ * PORT=3001 node dist/http.js
11
+ *
12
+ * Environment variables:
13
+ * PORT — HTTP port (default 3001)
14
+ * GRANTSIGNAL_API_URL — Override the default API endpoint
15
+ * GRANTSIGNAL_API_KEY — API key for paid tier features
16
+ */
17
+ import { createServer as createHttpServer } from "node:http";
18
+ import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
19
+ import { createServer } from "./server.js";
20
+ const PORT = parseInt(process.env.PORT || "3001", 10);
21
+ /**
22
+ * Parse the JSON body from an IncomingMessage.
23
+ */
24
+ function parseBody(req) {
25
+ return new Promise((resolve, reject) => {
26
+ const chunks = [];
27
+ req.on("data", (chunk) => chunks.push(chunk));
28
+ req.on("end", () => {
29
+ try {
30
+ const raw = Buffer.concat(chunks).toString("utf-8");
31
+ resolve(raw.length > 0 ? JSON.parse(raw) : undefined);
32
+ }
33
+ catch (err) {
34
+ reject(err);
35
+ }
36
+ });
37
+ req.on("error", reject);
38
+ });
39
+ }
40
+ /**
41
+ * Set CORS headers for cross-origin access (needed for ChatGPT web client).
42
+ */
43
+ function setCorsHeaders(res) {
44
+ res.setHeader("Access-Control-Allow-Origin", "*");
45
+ res.setHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, OPTIONS");
46
+ res.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization, mcp-session-id");
47
+ res.setHeader("Access-Control-Expose-Headers", "mcp-session-id");
48
+ }
49
+ // ── Create HTTP server ────────────────────────────────────────
50
+ // Map of session transports for stateful mode
51
+ const transports = new Map();
52
+ const httpServer = createHttpServer(async (req, res) => {
53
+ setCorsHeaders(res);
54
+ // Handle preflight
55
+ if (req.method === "OPTIONS") {
56
+ res.writeHead(204);
57
+ res.end();
58
+ return;
59
+ }
60
+ // Only handle /mcp endpoint
61
+ const url = new URL(req.url || "/", `http://localhost:${PORT}`);
62
+ if (url.pathname !== "/mcp") {
63
+ res.writeHead(404, { "Content-Type": "application/json" });
64
+ res.end(JSON.stringify({ error: "Not found. Use POST /mcp for MCP requests." }));
65
+ return;
66
+ }
67
+ // Health check via GET
68
+ if (req.method === "GET") {
69
+ res.writeHead(200, { "Content-Type": "application/json" });
70
+ res.end(JSON.stringify({
71
+ name: "grantsignal-mcp",
72
+ version: "1.0.0",
73
+ transport: "streamable-http",
74
+ status: "ok",
75
+ }));
76
+ return;
77
+ }
78
+ if (req.method === "POST") {
79
+ try {
80
+ const body = await parseBody(req);
81
+ // Check for existing session
82
+ const sessionId = req.headers["mcp-session-id"];
83
+ let transport;
84
+ if (sessionId && transports.has(sessionId)) {
85
+ // Reuse existing transport for this session
86
+ transport = transports.get(sessionId);
87
+ }
88
+ else if (!sessionId && isInitializeRequest(body)) {
89
+ // New session — create transport and MCP server
90
+ transport = new StreamableHTTPServerTransport({
91
+ sessionIdGenerator: () => crypto.randomUUID(),
92
+ });
93
+ const mcpServer = createServer();
94
+ await mcpServer.connect(transport);
95
+ // Store transport by session ID after handling (session ID is set during handleRequest)
96
+ transport.onclose = () => {
97
+ if (transport.sessionId) {
98
+ transports.delete(transport.sessionId);
99
+ console.error(`[HTTP] Session ${transport.sessionId} closed. Active: ${transports.size}`);
100
+ }
101
+ };
102
+ // Handle the request first so session ID gets assigned
103
+ await transport.handleRequest(req, res, body);
104
+ // Store the transport after session ID is assigned
105
+ if (transport.sessionId) {
106
+ transports.set(transport.sessionId, transport);
107
+ console.error(`[HTTP] New session ${transport.sessionId}. Active: ${transports.size}`);
108
+ }
109
+ return;
110
+ }
111
+ else {
112
+ // No session and not an initialize request
113
+ res.writeHead(400, { "Content-Type": "application/json" });
114
+ res.end(JSON.stringify({
115
+ jsonrpc: "2.0",
116
+ error: {
117
+ code: -32600,
118
+ message: "Bad Request: No valid session. Send an initialize request first.",
119
+ },
120
+ id: null,
121
+ }));
122
+ return;
123
+ }
124
+ await transport.handleRequest(req, res, body);
125
+ }
126
+ catch (err) {
127
+ console.error("[HTTP] Request error:", err.message);
128
+ if (!res.headersSent) {
129
+ res.writeHead(500, { "Content-Type": "application/json" });
130
+ res.end(JSON.stringify({
131
+ jsonrpc: "2.0",
132
+ error: { code: -32603, message: "Internal server error" },
133
+ id: null,
134
+ }));
135
+ }
136
+ }
137
+ return;
138
+ }
139
+ // Handle DELETE for session cleanup
140
+ if (req.method === "DELETE") {
141
+ const sessionId = req.headers["mcp-session-id"];
142
+ if (sessionId && transports.has(sessionId)) {
143
+ const transport = transports.get(sessionId);
144
+ await transport.close();
145
+ transports.delete(sessionId);
146
+ res.writeHead(200, { "Content-Type": "application/json" });
147
+ res.end(JSON.stringify({ status: "session closed" }));
148
+ }
149
+ else {
150
+ res.writeHead(404, { "Content-Type": "application/json" });
151
+ res.end(JSON.stringify({ error: "Session not found" }));
152
+ }
153
+ return;
154
+ }
155
+ res.writeHead(405, { "Content-Type": "application/json" });
156
+ res.end(JSON.stringify({ error: "Method not allowed" }));
157
+ });
158
+ /**
159
+ * Check if the request body is an MCP initialize request.
160
+ */
161
+ function isInitializeRequest(body) {
162
+ if (Array.isArray(body)) {
163
+ return body.some((msg) => msg?.method === "initialize");
164
+ }
165
+ return body?.method === "initialize";
166
+ }
167
+ // ── Start listening ───────────────────────────────────────────
168
+ httpServer.listen(PORT, () => {
169
+ console.error(`GrantSignal MCP HTTP server listening on http://localhost:${PORT}/mcp`);
170
+ console.error(` Transport: Streamable HTTP (stateful sessions)`);
171
+ console.error(` API target: ${process.env.GRANTSIGNAL_API_URL || "https://wooden-coyote-415.convex.site"}`);
172
+ });
173
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * GrantSignal MCP Server — stdio entry point
4
+ *
5
+ * Provides AI assistants with access to federal, NYC, NYS, and NJ
6
+ * grant opportunities via the Model Context Protocol (stdio transport).
7
+ *
8
+ * Usage:
9
+ * npx grantsignal-mcp-server
10
+ *
11
+ * Environment variables:
12
+ * GRANTSIGNAL_API_URL — Override the default API endpoint
13
+ * GRANTSIGNAL_API_KEY — API key for paid tier features
14
+ */
15
+ export {};
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;GAYG"}
package/dist/index.js ADDED
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * GrantSignal MCP Server — stdio entry point
4
+ *
5
+ * Provides AI assistants with access to federal, NYC, NYS, and NJ
6
+ * grant opportunities via the Model Context Protocol (stdio transport).
7
+ *
8
+ * Usage:
9
+ * npx grantsignal-mcp-server
10
+ *
11
+ * Environment variables:
12
+ * GRANTSIGNAL_API_URL — Override the default API endpoint
13
+ * GRANTSIGNAL_API_KEY — API key for paid tier features
14
+ */
15
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
16
+ import { createServer } from "./server.js";
17
+ async function main() {
18
+ const server = createServer();
19
+ const transport = new StdioServerTransport();
20
+ await server.connect(transport);
21
+ console.error("GrantSignal MCP server running on stdio");
22
+ }
23
+ main().catch((err) => {
24
+ console.error("Fatal error:", err);
25
+ process.exit(1);
26
+ });
27
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAC9B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;AAC3D,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;IACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * GrantSignal MCP Server — Shared Server Factory
3
+ *
4
+ * Creates an McpServer instance with all 11 grant tools registered.
5
+ * Used by both the stdio entry point (index.ts) and the HTTP entry point (http.ts).
6
+ */
7
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
8
+ export declare function createServer(): McpServer;
9
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAWpE,wBAAgB,YAAY,IAAI,SAAS,CAyoBxC"}