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.
- package/README.md +61 -0
- package/dist/client.d.ts +7 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +34 -0
- package/dist/client.js.map +1 -0
- package/dist/config.d.ts +13 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +14 -0
- package/dist/config.js.map +1 -0
- package/dist/http.d.ts +18 -0
- package/dist/http.d.ts.map +1 -0
- package/dist/http.js +173 -0
- package/dist/http.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +9 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +534 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/deadlines.d.ts +20 -0
- package/dist/tools/deadlines.d.ts.map +1 -0
- package/dist/tools/deadlines.js +57 -0
- package/dist/tools/deadlines.js.map +1 -0
- package/dist/tools/details.d.ts +26 -0
- package/dist/tools/details.d.ts.map +1 -0
- package/dist/tools/details.js +71 -0
- package/dist/tools/details.js.map +1 -0
- package/dist/tools/funder.d.ts +26 -0
- package/dist/tools/funder.d.ts.map +1 -0
- package/dist/tools/funder.js +74 -0
- package/dist/tools/funder.js.map +1 -0
- package/dist/tools/search.d.ts +26 -0
- package/dist/tools/search.d.ts.map +1 -0
- package/dist/tools/search.js +76 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/sources.d.ts +15 -0
- package/dist/tools/sources.d.ts.map +1 -0
- package/dist/tools/sources.js +47 -0
- package/dist/tools/sources.js.map +1 -0
- package/dist/types.d.ts +181 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- 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
|
package/dist/client.d.ts
ADDED
|
@@ -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"}
|
package/dist/config.d.ts
ADDED
|
@@ -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
|
package/dist/http.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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"}
|
package/dist/server.d.ts
ADDED
|
@@ -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"}
|