govtoolspro-mcp-server 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 +21 -0
- package/README.md +82 -0
- package/dist/api/client.js +90 -0
- package/dist/api/client.js.map +1 -0
- package/dist/index.js +74 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/balance.js +28 -0
- package/dist/tools/balance.js.map +1 -0
- package/dist/tools/findIncumbents.js +68 -0
- package/dist/tools/findIncumbents.js.map +1 -0
- package/dist/tools/findPartnersNear.js +55 -0
- package/dist/tools/findPartnersNear.js.map +1 -0
- package/dist/tools/getSolicitation.js +63 -0
- package/dist/tools/getSolicitation.js.map +1 -0
- package/dist/tools/lookupNecoData.js +59 -0
- package/dist/tools/lookupNecoData.js.map +1 -0
- package/dist/tools/predictRecompete.js +58 -0
- package/dist/tools/predictRecompete.js.map +1 -0
- package/dist/tools/scoreGoNoGo.js +65 -0
- package/dist/tools/scoreGoNoGo.js.map +1 -0
- package/package.json +52 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Michael Smyth
|
|
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,82 @@
|
|
|
1
|
+
# GovToolsPro MCP Server
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/govtoolspro-mcp-server)
|
|
4
|
+
[](https://registry.modelcontextprotocol.io/v0/servers?search=govtoolspro)
|
|
5
|
+
[](https://glama.ai/mcp/servers/smythmyke/govtoolspro-mcp-server)
|
|
6
|
+
[](https://smithery.ai/servers/smythmyke/govtoolspro-mcp-server)
|
|
7
|
+
[](LICENSE)
|
|
8
|
+
|
|
9
|
+
An [MCP](https://modelcontextprotocol.io) server that gives Claude (and any MCP client) **workflow tools for federal contractors** — not raw data access, but decisions: go/no-go scoring, incumbent intelligence, teaming-partner search, recompete prediction, Navy NECO lookup, and SAM.gov solicitation retrieval.
|
|
10
|
+
|
|
11
|
+
It wraps the live [GovToolsPro](https://govtoolspro.com) API. You bring an API key; the server proxies your calls.
|
|
12
|
+
|
|
13
|
+
## Tools
|
|
14
|
+
|
|
15
|
+
| Tool | Cost | What it does |
|
|
16
|
+
|---|---|---|
|
|
17
|
+
| `balance` | free | Credit balance + subscription status. |
|
|
18
|
+
| `get_solicitation` | free | Notice ID (or solicitation number) → structured SAM.gov fields (NAICS, PSC, set-aside, place of performance, deadline, contacts, attachment links). The workflow entry point. |
|
|
19
|
+
| `score_go_no_go` | free | Score a solicitation GO / NO-GO (0–100) against your company profile, with hard-blocker detection (CMMC, geographic, set-aside). |
|
|
20
|
+
| `find_incumbents` | free | Identify the current incumbent via USAspending + FPDS, with competition signals and anticipated next-award date. |
|
|
21
|
+
| `find_partners_near` | free | Rank nearby teaming partners / subcontractors by proximity for a place of performance. |
|
|
22
|
+
| `predict_recompete` | free | Discover expiring contracts (recompete opportunities) by NAICS/PSC/state/value, enriched with option-exercise signals. |
|
|
23
|
+
| `lookup_neco_data` | free | Parse a Navy NECO (neco.navy.mil) solicitation into structured fields. No other govcon MCP has this. |
|
|
24
|
+
|
|
25
|
+
Every tool returns decision-support output with a disclaimer — verify against the official solicitation before relying on results.
|
|
26
|
+
|
|
27
|
+
## Install
|
|
28
|
+
|
|
29
|
+
Add to your MCP client config (Claude Desktop, Claude Code, Cursor, Cline, Zed, …):
|
|
30
|
+
|
|
31
|
+
```jsonc
|
|
32
|
+
{
|
|
33
|
+
"mcpServers": {
|
|
34
|
+
"govtoolspro": {
|
|
35
|
+
"command": "npx",
|
|
36
|
+
"args": ["-y", "govtoolspro-mcp-server"],
|
|
37
|
+
"env": { "GOVTOOLSPRO_API_KEY": "gtp_live_..." }
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### Get an API key
|
|
44
|
+
|
|
45
|
+
Mint a key from the **GovToolsPro extension → Admin tab** (format `gtp_live_...` / `gtp_test_...`).
|
|
46
|
+
|
|
47
|
+
## Configuration
|
|
48
|
+
|
|
49
|
+
| Env var | Required | Default |
|
|
50
|
+
|---|---|---|
|
|
51
|
+
| `GOVTOOLSPRO_API_KEY` | yes | — |
|
|
52
|
+
| `GOVTOOLSPRO_API_BASE` | no | `https://mcp.govtoolspro.com/api/v1/workflows` |
|
|
53
|
+
|
|
54
|
+
## Local development
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
npm install
|
|
58
|
+
npm run build
|
|
59
|
+
|
|
60
|
+
# end-to-end stdio smoke test against the live API
|
|
61
|
+
GOVTOOLSPRO_API_KEY=gtp_test_... npm run smoke
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
To point a client at your local build:
|
|
65
|
+
|
|
66
|
+
```jsonc
|
|
67
|
+
{
|
|
68
|
+
"command": "node",
|
|
69
|
+
"args": ["/absolute/path/to/govtoolspro-mcp-server/dist/index.js"],
|
|
70
|
+
"env": { "GOVTOOLSPRO_API_KEY": "gtp_test_..." }
|
|
71
|
+
}
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## Notes
|
|
75
|
+
|
|
76
|
+
- **Workflow MCP, not a data wrapper.** Competing govcon MCPs return raw SAM.gov/FPDS JSON; these tools return synthesized decisions.
|
|
77
|
+
- **CUI safety.** The API rejects content with CUI / FOUO / Distribution-Statement markings; those rejections surface to the client as clear errors. Do not submit controlled content.
|
|
78
|
+
- **No warranty.** Output is decision support only — not legal, contractual, or award-outcome advice.
|
|
79
|
+
|
|
80
|
+
## License
|
|
81
|
+
|
|
82
|
+
MIT © Michael Smyth
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
const DEFAULT_API_BASE = "https://mcp.govtoolspro.com/api/v1/workflows";
|
|
2
|
+
const VERSION = "0.1.0";
|
|
3
|
+
export class GovToolsProApiError extends Error {
|
|
4
|
+
status;
|
|
5
|
+
code;
|
|
6
|
+
constructor(message, status, code) {
|
|
7
|
+
super(message);
|
|
8
|
+
this.status = status;
|
|
9
|
+
this.code = code;
|
|
10
|
+
this.name = "GovToolsProApiError";
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export class GovToolsProApiClient {
|
|
14
|
+
apiKey;
|
|
15
|
+
baseUrl;
|
|
16
|
+
constructor(opts) {
|
|
17
|
+
if (!opts.apiKey) {
|
|
18
|
+
throw new Error("GOVTOOLSPRO_API_KEY is required");
|
|
19
|
+
}
|
|
20
|
+
this.apiKey = opts.apiKey;
|
|
21
|
+
this.baseUrl = (opts.baseUrl ?? DEFAULT_API_BASE).replace(/\/$/, "");
|
|
22
|
+
}
|
|
23
|
+
async post(path, body) {
|
|
24
|
+
return this.request("POST", path, body);
|
|
25
|
+
}
|
|
26
|
+
async get(path) {
|
|
27
|
+
return this.request("GET", path);
|
|
28
|
+
}
|
|
29
|
+
async request(method, path, body) {
|
|
30
|
+
const url = `${this.baseUrl}${path.startsWith("/") ? path : `/${path}`}`;
|
|
31
|
+
const res = await fetch(url, {
|
|
32
|
+
method,
|
|
33
|
+
headers: {
|
|
34
|
+
"X-API-Key": this.apiKey,
|
|
35
|
+
"Content-Type": "application/json",
|
|
36
|
+
"User-Agent": `govtoolspro-mcp-server/${VERSION}`,
|
|
37
|
+
},
|
|
38
|
+
body: body ? JSON.stringify(body) : undefined,
|
|
39
|
+
});
|
|
40
|
+
const text = await res.text();
|
|
41
|
+
let parsed;
|
|
42
|
+
try {
|
|
43
|
+
parsed = text ? JSON.parse(text) : {};
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
parsed = { error: { message: text } };
|
|
47
|
+
}
|
|
48
|
+
if (!res.ok) {
|
|
49
|
+
const errObj = parsed.error;
|
|
50
|
+
const errorMessage = typeof errObj === "string"
|
|
51
|
+
? errObj
|
|
52
|
+
: errObj?.message ?? `HTTP ${res.status}`;
|
|
53
|
+
throw new GovToolsProApiError(humanizeError(res.status, errorMessage), res.status, codeForStatus(res.status));
|
|
54
|
+
}
|
|
55
|
+
const wrapper = parsed;
|
|
56
|
+
return {
|
|
57
|
+
data: (wrapper.data ?? parsed),
|
|
58
|
+
disclaimer: wrapper.disclaimer,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
function codeForStatus(status) {
|
|
63
|
+
switch (status) {
|
|
64
|
+
case 401:
|
|
65
|
+
return "unauthenticated";
|
|
66
|
+
case 402:
|
|
67
|
+
return "payment_required";
|
|
68
|
+
case 403:
|
|
69
|
+
return "permission_denied";
|
|
70
|
+
case 404:
|
|
71
|
+
return "not_found";
|
|
72
|
+
case 429:
|
|
73
|
+
return "rate_limited";
|
|
74
|
+
default:
|
|
75
|
+
return status >= 500 ? "server_error" : "bad_request";
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
function humanizeError(status, message) {
|
|
79
|
+
switch (status) {
|
|
80
|
+
case 401:
|
|
81
|
+
return "Invalid or missing GOVTOOLSPRO_API_KEY. Mint a new key from the GovToolsPro extension's Admin tab.";
|
|
82
|
+
case 402:
|
|
83
|
+
return "Out of credits. Purchase a credit pack from the GovToolsPro extension's Tools tab.";
|
|
84
|
+
case 429:
|
|
85
|
+
return "Rate limit exceeded. Wait a moment and retry.";
|
|
86
|
+
default:
|
|
87
|
+
return message;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
3
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
4
|
+
import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
|
|
5
|
+
import { GovToolsProApiClient, GovToolsProApiError } from "./api/client.js";
|
|
6
|
+
import { balanceTool, runBalance } from "./tools/balance.js";
|
|
7
|
+
import { getSolicitationTool, runGetSolicitation } from "./tools/getSolicitation.js";
|
|
8
|
+
import { scoreGoNoGoTool, runScoreGoNoGo } from "./tools/scoreGoNoGo.js";
|
|
9
|
+
import { findIncumbentsTool, runFindIncumbents } from "./tools/findIncumbents.js";
|
|
10
|
+
import { findPartnersNearTool, runFindPartnersNear } from "./tools/findPartnersNear.js";
|
|
11
|
+
import { predictRecompeteTool, runPredictRecompete } from "./tools/predictRecompete.js";
|
|
12
|
+
import { lookupNecoDataTool, runLookupNecoData } from "./tools/lookupNecoData.js";
|
|
13
|
+
const SERVER_NAME = "govtoolspro";
|
|
14
|
+
const SERVER_VERSION = "0.1.0";
|
|
15
|
+
function readEnv(name, required = true) {
|
|
16
|
+
const value = process.env[name];
|
|
17
|
+
if (!value && required) {
|
|
18
|
+
process.stderr.write(`[govtoolspro-mcp] ${name} is not set. Mint a key from the GovToolsPro extension's Admin tab and set it in your MCP client config.\n`);
|
|
19
|
+
process.exit(1);
|
|
20
|
+
}
|
|
21
|
+
return value ?? "";
|
|
22
|
+
}
|
|
23
|
+
async function main() {
|
|
24
|
+
const apiKey = readEnv("GOVTOOLSPRO_API_KEY");
|
|
25
|
+
const baseUrl = process.env.GOVTOOLSPRO_API_BASE;
|
|
26
|
+
const api = new GovToolsProApiClient({ apiKey, baseUrl });
|
|
27
|
+
const server = new Server({ name: SERVER_NAME, version: SERVER_VERSION }, { capabilities: { tools: {} } });
|
|
28
|
+
const tools = [
|
|
29
|
+
balanceTool,
|
|
30
|
+
getSolicitationTool,
|
|
31
|
+
scoreGoNoGoTool,
|
|
32
|
+
findIncumbentsTool,
|
|
33
|
+
findPartnersNearTool,
|
|
34
|
+
predictRecompeteTool,
|
|
35
|
+
lookupNecoDataTool,
|
|
36
|
+
];
|
|
37
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools }));
|
|
38
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
39
|
+
const { name, arguments: args } = request.params;
|
|
40
|
+
try {
|
|
41
|
+
switch (name) {
|
|
42
|
+
case balanceTool.name: return await runBalance(api);
|
|
43
|
+
case getSolicitationTool.name: return await runGetSolicitation(api, args ?? {});
|
|
44
|
+
case scoreGoNoGoTool.name: return await runScoreGoNoGo(api, args ?? {});
|
|
45
|
+
case findIncumbentsTool.name: return await runFindIncumbents(api, args ?? {});
|
|
46
|
+
case findPartnersNearTool.name: return await runFindPartnersNear(api, args ?? {});
|
|
47
|
+
case predictRecompeteTool.name: return await runPredictRecompete(api, args ?? {});
|
|
48
|
+
case lookupNecoDataTool.name: return await runLookupNecoData(api, args ?? {});
|
|
49
|
+
default:
|
|
50
|
+
return errorResult(`Unknown tool: ${name}`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
if (err instanceof GovToolsProApiError) {
|
|
55
|
+
return errorResult(err.message);
|
|
56
|
+
}
|
|
57
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
58
|
+
return errorResult(message);
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
const transport = new StdioServerTransport();
|
|
62
|
+
await server.connect(transport);
|
|
63
|
+
}
|
|
64
|
+
function errorResult(message) {
|
|
65
|
+
return {
|
|
66
|
+
isError: true,
|
|
67
|
+
content: [{ type: "text", text: message }],
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
main().catch((err) => {
|
|
71
|
+
process.stderr.write(`[govtoolspro-mcp] Fatal: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
72
|
+
process.exit(1);
|
|
73
|
+
});
|
|
74
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export const balanceTool = {
|
|
2
|
+
name: "balance",
|
|
3
|
+
description: "Return the current GovToolsPro credit balance and subscription status for the authenticated account. " +
|
|
4
|
+
"Free — exercises auth end-to-end. The extension and the API draw from the same shared credit pool.",
|
|
5
|
+
inputSchema: {
|
|
6
|
+
type: "object",
|
|
7
|
+
properties: {},
|
|
8
|
+
additionalProperties: false,
|
|
9
|
+
},
|
|
10
|
+
};
|
|
11
|
+
export async function runBalance(api) {
|
|
12
|
+
const { data, disclaimer } = await api.get("/balance");
|
|
13
|
+
const lines = [
|
|
14
|
+
`Credit balance: ${data.balance}`,
|
|
15
|
+
data.subscriptionCredits !== undefined ? ` • Subscription credits: ${data.subscriptionCredits}` : null,
|
|
16
|
+
data.topupCredits !== undefined ? ` • Top-up credits: ${data.topupCredits}` : null,
|
|
17
|
+
data.totalUsed !== undefined ? `Total used: ${data.totalUsed}` : null,
|
|
18
|
+
data.subscription
|
|
19
|
+
? `Subscription: ${data.subscription.planId ?? "unknown"} (${data.subscription.status ?? "unknown"})`
|
|
20
|
+
: "Subscription: none",
|
|
21
|
+
disclaimer ? `\n${disclaimer}` : null,
|
|
22
|
+
].filter((s) => s !== null);
|
|
23
|
+
return {
|
|
24
|
+
content: [{ type: "text", text: lines.join("\n") }],
|
|
25
|
+
structuredContent: data,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=balance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"balance.js","sourceRoot":"","sources":["../../src/tools/balance.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,IAAI,EAAE,SAAS;IACf,WAAW,EACT,uGAAuG;QACvG,oGAAoG;IACtG,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE,EAAE;QACd,oBAAoB,EAAE,KAAK;KAC5B;CACO,CAAC;AAWX,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAyB;IAIxD,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,MAAM,GAAG,CAAC,GAAG,CAAkB,UAAU,CAAC,CAAC;IACxE,MAAM,KAAK,GAAG;QACZ,mBAAmB,IAAI,CAAC,OAAO,EAAE;QACjC,IAAI,CAAC,mBAAmB,KAAK,SAAS,CAAC,CAAC,CAAC,6BAA6B,IAAI,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC,IAAI;QACvG,IAAI,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,uBAAuB,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,IAAI;QACnF,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,eAAe,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI;QACrE,IAAI,CAAC,YAAY;YACf,CAAC,CAAC,iBAAiB,IAAI,CAAC,YAAY,CAAC,MAAM,IAAI,SAAS,KAAK,IAAI,CAAC,YAAY,CAAC,MAAM,IAAI,SAAS,GAAG;YACrG,CAAC,CAAC,oBAAoB;QACxB,UAAU,CAAC,CAAC,CAAC,KAAK,UAAU,EAAE,CAAC,CAAC,CAAC,IAAI;KACtC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;IACzC,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,iBAAiB,EAAE,IAAI;KACxB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
export const findIncumbentsTool = {
|
|
2
|
+
name: "find_incumbents",
|
|
3
|
+
description: "Identify the likely current incumbent(s) for a solicitation using public USAspending + FPDS award data. " +
|
|
4
|
+
"Returns the primary incumbent (name, award value, period of performance), FPDS competition signals " +
|
|
5
|
+
"(offers received, set-aside, sole-source flags), and an anticipated next-award start date. " +
|
|
6
|
+
"Deterministic, free. FPDS failures degrade gracefully (USAspending half stays intact).",
|
|
7
|
+
inputSchema: {
|
|
8
|
+
type: "object",
|
|
9
|
+
properties: {
|
|
10
|
+
solicitation: {
|
|
11
|
+
type: "object",
|
|
12
|
+
description: "Solicitation context. naicsCode is REQUIRED. Optional: pscCode, agency, subAgency, office, placeOfPerformance, title, responseDeadline.",
|
|
13
|
+
properties: {
|
|
14
|
+
naicsCode: { type: "string", description: "NAICS code (required)." },
|
|
15
|
+
pscCode: { type: "string" },
|
|
16
|
+
agency: { type: "string" },
|
|
17
|
+
subAgency: { type: "string" },
|
|
18
|
+
office: { type: "string" },
|
|
19
|
+
placeOfPerformance: { type: "string" },
|
|
20
|
+
title: { type: "string" },
|
|
21
|
+
responseDeadline: { type: "string" },
|
|
22
|
+
},
|
|
23
|
+
required: ["naicsCode"],
|
|
24
|
+
},
|
|
25
|
+
years: { type: "number", description: "USAspending lookback in fiscal years (default 5, max 10)." },
|
|
26
|
+
limit: { type: "number", description: "Max USAspending contracts (default 50, max 100)." },
|
|
27
|
+
fpdsMaxResults: { type: "number", description: "Max FPDS contracts (default 50, max 100)." },
|
|
28
|
+
anticipatedStartDate: {
|
|
29
|
+
type: "string",
|
|
30
|
+
description: "ISO date overriding the responseDeadline-based anticipated-start calculation.",
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
required: ["solicitation"],
|
|
34
|
+
additionalProperties: false,
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
export async function runFindIncumbents(api, args) {
|
|
38
|
+
const solicitation = args.solicitation;
|
|
39
|
+
if (!solicitation || typeof solicitation !== "object") {
|
|
40
|
+
throw new Error("solicitation (object) is required");
|
|
41
|
+
}
|
|
42
|
+
if (!solicitation.naicsCode) {
|
|
43
|
+
throw new Error("solicitation.naicsCode is required");
|
|
44
|
+
}
|
|
45
|
+
const body = { solicitation };
|
|
46
|
+
for (const k of ["years", "limit", "fpdsMaxResults", "anticipatedStartDate"]) {
|
|
47
|
+
if (args[k] !== undefined)
|
|
48
|
+
body[k] = args[k];
|
|
49
|
+
}
|
|
50
|
+
const { data, disclaimer } = await api.post("/find-incumbents", body);
|
|
51
|
+
const p = data.primaryIncumbent;
|
|
52
|
+
const lines = [
|
|
53
|
+
p
|
|
54
|
+
? `Primary incumbent: ${p.companyName ?? "unknown"}${p.totalValue ? ` — $${Number(p.totalValue).toLocaleString()}` : ""}${p.contractCount ? ` across ${p.contractCount} contract(s)` : ""}`
|
|
55
|
+
: "Primary incumbent: none identified",
|
|
56
|
+
p?.fpdsData
|
|
57
|
+
? ` FPDS signals: ${p.fpdsData.numberOfOffersReceived ?? "?"} offer(s) received${p.fpdsData.typeOfSetAside ? `, set-aside ${p.fpdsData.typeOfSetAside}` : ""}`
|
|
58
|
+
: null,
|
|
59
|
+
data.anticipatedStartDate ? `Anticipated next-award start: ${data.anticipatedStartDate}` : null,
|
|
60
|
+
`Sources: USAspending ${data.usaspendingResults ?? 0} result(s), FPDS ${data.fpdsResults ?? 0} result(s)${data.fpdsError ? ` (FPDS degraded: ${data.fpdsError})` : ""}`,
|
|
61
|
+
disclaimer ? `\n${disclaimer}` : null,
|
|
62
|
+
].filter((s) => s !== null);
|
|
63
|
+
return {
|
|
64
|
+
content: [{ type: "text", text: lines.join("\n") }],
|
|
65
|
+
structuredContent: data,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=findIncumbents.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"findIncumbents.js","sourceRoot":"","sources":["../../src/tools/findIncumbents.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
export const findPartnersNearTool = {
|
|
2
|
+
name: "find_partners_near",
|
|
3
|
+
description: "Find potential teaming partners / subcontractors near a solicitation's place of performance via Google Places. " +
|
|
4
|
+
"Given a capability keyword and a geocodable address, returns nearby businesses ranked by proximity, " +
|
|
5
|
+
"enriched (top results) with phone and website. Deterministic, free. " +
|
|
6
|
+
"Verify capabilities, certifications, and eligibility independently before relying on results.",
|
|
7
|
+
inputSchema: {
|
|
8
|
+
type: "object",
|
|
9
|
+
properties: {
|
|
10
|
+
keyword: {
|
|
11
|
+
type: "string",
|
|
12
|
+
description: "Industry/capability term, e.g. 'IT support', 'electrical contractor', 'janitorial services'.",
|
|
13
|
+
},
|
|
14
|
+
address: {
|
|
15
|
+
type: "string",
|
|
16
|
+
description: "Place of performance — any geocodable string, e.g. 'Arlington, VA' or a full street address.",
|
|
17
|
+
},
|
|
18
|
+
radius: {
|
|
19
|
+
type: "number",
|
|
20
|
+
description: "Search radius in miles (default 25, max 100).",
|
|
21
|
+
default: 25,
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
required: ["keyword", "address"],
|
|
25
|
+
additionalProperties: false,
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
export async function runFindPartnersNear(api, args) {
|
|
29
|
+
const keyword = typeof args.keyword === "string" ? args.keyword : "";
|
|
30
|
+
const address = typeof args.address === "string" ? args.address : "";
|
|
31
|
+
if (!keyword)
|
|
32
|
+
throw new Error("keyword is required");
|
|
33
|
+
if (!address)
|
|
34
|
+
throw new Error("address is required");
|
|
35
|
+
const body = { keyword, address };
|
|
36
|
+
if (typeof args.radius === "number")
|
|
37
|
+
body.radius = args.radius;
|
|
38
|
+
const { data, disclaimer } = await api.post("/find-partners-near", body);
|
|
39
|
+
const lines = [
|
|
40
|
+
`${data.totalResults} partner candidate(s) for "${keyword}" near ${address}:`,
|
|
41
|
+
...data.businesses.slice(0, 10).map((b, i) => {
|
|
42
|
+
const dist = b.distanceMiles !== undefined ? `${b.distanceMiles.toFixed(1)} mi` : "?";
|
|
43
|
+
const rating = b.rating !== undefined ? `★${b.rating}` : "";
|
|
44
|
+
const contact = [b.phone, b.website].filter(Boolean).join(" · ");
|
|
45
|
+
return ` ${i + 1}. ${b.name ?? "n/a"} (${dist}) ${rating}\n ${b.formattedAddress ?? ""}${contact ? `\n ${contact}` : ""}`;
|
|
46
|
+
}),
|
|
47
|
+
data.businesses.length > 10 ? ` … and ${data.businesses.length - 10} more in structuredContent.businesses` : null,
|
|
48
|
+
disclaimer ? `\n${disclaimer}` : null,
|
|
49
|
+
].filter((s) => s !== null);
|
|
50
|
+
return {
|
|
51
|
+
content: [{ type: "text", text: lines.join("\n") }],
|
|
52
|
+
structuredContent: data,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=findPartnersNear.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"findPartnersNear.js","sourceRoot":"","sources":["../../src/tools/findPartnersNear.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
export const getSolicitationTool = {
|
|
2
|
+
name: "get_solicitation",
|
|
3
|
+
description: "Retrieve a single SAM.gov solicitation's structured fields by notice ID (or, best-effort, by solicitation number). " +
|
|
4
|
+
"Returns title, solicitation number, type, NAICS, PSC, set-aside, place of performance, response deadline (with timezone), " +
|
|
5
|
+
"points of contact, description, and attachment download links. Deterministic, free — pulls from SAM.gov's public opportunity records. " +
|
|
6
|
+
"This is the entry point for a workflow: feed the returned fields into score_go_no_go, find_incumbents, or find_partners_near.",
|
|
7
|
+
inputSchema: {
|
|
8
|
+
type: "object",
|
|
9
|
+
properties: {
|
|
10
|
+
noticeId: {
|
|
11
|
+
type: "string",
|
|
12
|
+
description: "32-character hex SAM.gov notice ID (the ID in a sam.gov/opp/<id>/view URL). Primary, most reliable input.",
|
|
13
|
+
},
|
|
14
|
+
solicitationNumber: {
|
|
15
|
+
type: "string",
|
|
16
|
+
description: "Solicitation number (e.g. '140P6026Q0003'). Best-effort fallback — resolved via SAM.gov search; provide noticeId when you have it.",
|
|
17
|
+
},
|
|
18
|
+
includeAttachments: {
|
|
19
|
+
type: "boolean",
|
|
20
|
+
description: "Include attachment download links (default true). Set false to skip the extra lookup.",
|
|
21
|
+
default: true,
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
additionalProperties: false,
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
export async function runGetSolicitation(api, args) {
|
|
28
|
+
const noticeId = typeof args.noticeId === "string" ? args.noticeId : undefined;
|
|
29
|
+
const solicitationNumber = typeof args.solicitationNumber === "string" ? args.solicitationNumber : undefined;
|
|
30
|
+
if (!noticeId && !solicitationNumber) {
|
|
31
|
+
throw new Error("Provide either noticeId or solicitationNumber");
|
|
32
|
+
}
|
|
33
|
+
const body = {};
|
|
34
|
+
if (noticeId)
|
|
35
|
+
body.noticeId = noticeId;
|
|
36
|
+
if (solicitationNumber)
|
|
37
|
+
body.solicitationNumber = solicitationNumber;
|
|
38
|
+
if (typeof args.includeAttachments === "boolean")
|
|
39
|
+
body.includeAttachments = args.includeAttachments;
|
|
40
|
+
const { data, disclaimer } = await api.post("/get-solicitation", body);
|
|
41
|
+
const pop = data.placeOfPerformance;
|
|
42
|
+
const popStr = pop
|
|
43
|
+
? [pop.city, pop.state, pop.zip].filter(Boolean).join(", ")
|
|
44
|
+
: "n/a";
|
|
45
|
+
const poc = data.pointOfContact?.[0];
|
|
46
|
+
const lines = [
|
|
47
|
+
`${data.title || "(untitled)"} ${data.solicitationNumber ? `[${data.solicitationNumber}]` : ""}`.trim(),
|
|
48
|
+
`Type: ${data.typeLabel || data.type || "n/a"}${data.cancelled ? " — CANCELLED" : ""}${data.archived ? " — ARCHIVED" : ""}`,
|
|
49
|
+
`NAICS: ${data.naicsCode || "n/a"}${data.naicsCodes && data.naicsCodes.length > 1 ? ` (+${data.naicsCodes.length - 1} more)` : ""} | PSC: ${data.pscCode || "n/a"} | Set-aside: ${data.setAside || "none"}`,
|
|
50
|
+
`Response deadline: ${data.responseDeadline || "n/a"}${data.responseTimeZone ? ` (${data.responseTimeZone})` : ""}`,
|
|
51
|
+
`Place of performance: ${popStr}`,
|
|
52
|
+
poc ? `Primary contact: ${poc.fullName || "n/a"}${poc.email ? ` <${poc.email}>` : ""}${poc.phone ? ` ${poc.phone}` : ""}` : null,
|
|
53
|
+
data.attachments ? `Attachments: ${data.attachments.length}${data.attachmentsError ? ` (lookup error: ${data.attachmentsError})` : ""}` : null,
|
|
54
|
+
data.link ? `Link: ${data.link}` : null,
|
|
55
|
+
data.description ? `\nDescription:\n${data.description.slice(0, 600)}${data.description.length > 600 ? " …" : ""}` : null,
|
|
56
|
+
disclaimer ? `\n${disclaimer}` : null,
|
|
57
|
+
].filter((s) => s !== null);
|
|
58
|
+
return {
|
|
59
|
+
content: [{ type: "text", text: lines.join("\n") }],
|
|
60
|
+
structuredContent: data,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=getSolicitation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getSolicitation.js","sourceRoot":"","sources":["../../src/tools/getSolicitation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
export const lookupNecoDataTool = {
|
|
2
|
+
name: "lookup_neco_data",
|
|
3
|
+
description: "Fetch and parse a Navy NECO (Navy Electronic Commerce Online) solicitation page into structured data — " +
|
|
4
|
+
"solicitation number, title, response deadline, NSN/line items, buyer contact, set-aside, and document links. " +
|
|
5
|
+
"Deterministic scrape of the public neco.navy.mil site, free. No other govcon MCP exposes NECO data. " +
|
|
6
|
+
"Pass the full NECO URL when you have it (most reliable); solicitationNumber alone is best-effort.",
|
|
7
|
+
inputSchema: {
|
|
8
|
+
type: "object",
|
|
9
|
+
properties: {
|
|
10
|
+
necoUrl: {
|
|
11
|
+
type: "string",
|
|
12
|
+
description: "Full NECO solicitation URL (https://www.neco.navy.mil/...). Primary, most robust input.",
|
|
13
|
+
},
|
|
14
|
+
solicitationNumber: {
|
|
15
|
+
type: "string",
|
|
16
|
+
description: "Navy solicitation number. Best-effort — the main NECO page may require an hkey to resolve.",
|
|
17
|
+
},
|
|
18
|
+
hkey: {
|
|
19
|
+
type: "string",
|
|
20
|
+
description: "Optional NECO hkey — improves solicitationNumber resolution.",
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
additionalProperties: false,
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
export async function runLookupNecoData(api, args) {
|
|
27
|
+
const necoUrl = typeof args.necoUrl === "string" ? args.necoUrl : undefined;
|
|
28
|
+
const solicitationNumber = typeof args.solicitationNumber === "string" ? args.solicitationNumber : undefined;
|
|
29
|
+
if (!necoUrl && !solicitationNumber) {
|
|
30
|
+
throw new Error("Provide either necoUrl or solicitationNumber");
|
|
31
|
+
}
|
|
32
|
+
const body = {};
|
|
33
|
+
if (necoUrl)
|
|
34
|
+
body.necoUrl = necoUrl;
|
|
35
|
+
if (solicitationNumber)
|
|
36
|
+
body.solicitationNumber = solicitationNumber;
|
|
37
|
+
if (typeof args.hkey === "string")
|
|
38
|
+
body.hkey = args.hkey;
|
|
39
|
+
const { data, disclaimer } = await api.post("/lookup-neco-data", body);
|
|
40
|
+
const s = data.summary ?? {};
|
|
41
|
+
const lines = [
|
|
42
|
+
`${s.title ?? "(untitled)"} ${s.solicitationNumber ? `[${s.solicitationNumber}]` : ""}`.trim(),
|
|
43
|
+
`Issue date: ${s.issueDate ?? "n/a"} | Response deadline: ${s.responseDeadline ?? "n/a"}`,
|
|
44
|
+
`Contract type: ${s.contractType ?? "n/a"} | Set-aside: ${s.setAside ?? "none"}`,
|
|
45
|
+
s.nsn ? `NSN: ${s.nsn}${s.quantity ? ` | Qty: ${s.quantity}` : ""}` : null,
|
|
46
|
+
s.buyingOffice ? `Buying office: ${s.buyingOffice}` : null,
|
|
47
|
+
s.buyerName || s.buyerEmail || s.buyerPhone
|
|
48
|
+
? `Buyer: ${s.buyerName ?? "n/a"}${s.buyerEmail ? ` <${s.buyerEmail}>` : ""}${s.buyerPhone ? ` ${s.buyerPhone}` : ""}`
|
|
49
|
+
: null,
|
|
50
|
+
s.documentsUrl ? `Documents: ${s.documentsUrl}` : null,
|
|
51
|
+
`Source: ${data.requestedUrl}`,
|
|
52
|
+
disclaimer ? `\n${disclaimer}` : null,
|
|
53
|
+
].filter((s2) => s2 !== null);
|
|
54
|
+
return {
|
|
55
|
+
content: [{ type: "text", text: lines.join("\n") }],
|
|
56
|
+
structuredContent: data,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=lookupNecoData.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lookupNecoData.js","sourceRoot":"","sources":["../../src/tools/lookupNecoData.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
export const predictRecompeteTool = {
|
|
2
|
+
name: "predict_recompete",
|
|
3
|
+
description: "Discover federal contracts expiring within a window (recompete opportunities) via public USAspending data, " +
|
|
4
|
+
"optionally enriched with procurement-history signals (all-options-exercised, offers received, set-aside, competition type). " +
|
|
5
|
+
"Filter by NAICS, PSC, state, value, and keywords. Returns contracts with days-until-expiration and urgency. " +
|
|
6
|
+
"Deterministic, free. Expiration/option signals reflect reported data and may lag.",
|
|
7
|
+
inputSchema: {
|
|
8
|
+
type: "object",
|
|
9
|
+
properties: {
|
|
10
|
+
filters: {
|
|
11
|
+
type: "object",
|
|
12
|
+
description: "All optional. Narrow the recompete search.",
|
|
13
|
+
properties: {
|
|
14
|
+
naicsCodes: { type: "array", items: { type: "string" }, description: "NAICS codes (2/4/6 digit)." },
|
|
15
|
+
pscCodes: { type: "array", items: { type: "string" }, description: "PSC codes." },
|
|
16
|
+
states: { type: "array", items: { type: "string" }, description: "2-letter place-of-performance state codes." },
|
|
17
|
+
minContractValue: { type: "number", description: "Default 500000." },
|
|
18
|
+
maxContractValue: { type: "number" },
|
|
19
|
+
expirationWindowDays: { type: "number", description: "Default 365 (max 1095)." },
|
|
20
|
+
keywords: { type: "array", items: { type: "string" } },
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
page: { type: "number", description: "Page number (default 1)." },
|
|
24
|
+
limit: { type: "number", description: "Results per page (default 25, max 100)." },
|
|
25
|
+
sortOrder: { type: "string", enum: ["asc", "desc"], description: "Sort by End Date (default 'desc')." },
|
|
26
|
+
enrich: { type: "boolean", description: "Enrich top results with procurement history (default true)." },
|
|
27
|
+
enrichCount: { type: "number", description: "How many to enrich (default 10, max 25)." },
|
|
28
|
+
},
|
|
29
|
+
additionalProperties: false,
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
export async function runPredictRecompete(api, args) {
|
|
33
|
+
if (args.filters !== undefined && (typeof args.filters !== "object" || Array.isArray(args.filters))) {
|
|
34
|
+
throw new Error("filters must be an object if provided");
|
|
35
|
+
}
|
|
36
|
+
const body = {};
|
|
37
|
+
for (const k of ["filters", "page", "limit", "sortOrder", "enrich", "enrichCount"]) {
|
|
38
|
+
if (args[k] !== undefined)
|
|
39
|
+
body[k] = args[k];
|
|
40
|
+
}
|
|
41
|
+
const { data, disclaimer } = await api.post("/predict-recompete", body);
|
|
42
|
+
const lines = [
|
|
43
|
+
`${data.totalCount} recompete candidate(s)${data.hasMore ? " (more available — page through)" : ""}:`,
|
|
44
|
+
...data.contracts.slice(0, 10).map((c, i) => {
|
|
45
|
+
const val = c.awardAmount ? `$${Number(c.awardAmount).toLocaleString()}` : "n/a";
|
|
46
|
+
const days = c.daysUntilExpiration !== undefined ? `${c.daysUntilExpiration}d to expiry` : "expiry n/a";
|
|
47
|
+
const opt = c.procurementHistory?.allOptionsExercised ? " · all options exercised" : "";
|
|
48
|
+
return ` ${i + 1}. ${c.recipientName ?? "n/a"} — ${val} [${c.urgency ?? "?"}, ${days}]${opt}\n ${c.awardId ?? ""} ends ${c.endDate ?? "?"}`;
|
|
49
|
+
}),
|
|
50
|
+
data.contracts.length > 10 ? ` … and ${data.contracts.length - 10} more in structuredContent.contracts` : null,
|
|
51
|
+
disclaimer ? `\n${disclaimer}` : null,
|
|
52
|
+
].filter((s) => s !== null);
|
|
53
|
+
return {
|
|
54
|
+
content: [{ type: "text", text: lines.join("\n") }],
|
|
55
|
+
structuredContent: data,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=predictRecompete.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"predictRecompete.js","sourceRoot":"","sources":["../../src/tools/predictRecompete.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
export const scoreGoNoGoTool = {
|
|
2
|
+
name: "score_go_no_go",
|
|
3
|
+
description: "Score a federal solicitation as GO / NO-GO (0-100) against a company profile. " +
|
|
4
|
+
"Detects hard blockers (CMMC certification gaps, geographic/OEM constraints, set-aside ineligibility), " +
|
|
5
|
+
"scores NAICS match, past performance, and capability fit, and returns a recommendation with red flags and reasons. " +
|
|
6
|
+
"Deterministic decision-support — no AI, free. Pass the analyzed solicitation documents (from your extension or " +
|
|
7
|
+
"an analyze-solicitation step) plus your company profile.",
|
|
8
|
+
inputSchema: {
|
|
9
|
+
type: "object",
|
|
10
|
+
properties: {
|
|
11
|
+
documentAnalyses: {
|
|
12
|
+
type: "array",
|
|
13
|
+
description: "Analyzed solicitation documents (required, at least one). Each item is the structured analysis of a solicitation document " +
|
|
14
|
+
"(summary, classification with naicsCode/setAside, valueAndScope with placeOfPerformance, etc.).",
|
|
15
|
+
items: { type: "object" },
|
|
16
|
+
},
|
|
17
|
+
profile: {
|
|
18
|
+
type: "object",
|
|
19
|
+
description: "Company profile to score against: company (legalName, address.state), industryCodes.primaryNaics, " +
|
|
20
|
+
"businessTypes (smallBusiness, sdvosb, ...), capabilities (coreCompetencies, cmmcStatus.level).",
|
|
21
|
+
},
|
|
22
|
+
solicitationData: {
|
|
23
|
+
type: "object",
|
|
24
|
+
description: "Optional extra solicitation context, e.g. { responseDeadline }.",
|
|
25
|
+
},
|
|
26
|
+
incumbentData: {
|
|
27
|
+
type: "object",
|
|
28
|
+
description: "Optional incumbent context, e.g. { primaryIncumbent } from find_incumbents.",
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
required: ["documentAnalyses"],
|
|
32
|
+
additionalProperties: false,
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
export async function runScoreGoNoGo(api, args) {
|
|
36
|
+
if (!Array.isArray(args.documentAnalyses) || args.documentAnalyses.length === 0) {
|
|
37
|
+
throw new Error("documentAnalyses (non-empty array) is required");
|
|
38
|
+
}
|
|
39
|
+
const body = { documentAnalyses: args.documentAnalyses };
|
|
40
|
+
if (args.profile)
|
|
41
|
+
body.profile = args.profile;
|
|
42
|
+
if (args.solicitationData)
|
|
43
|
+
body.solicitationData = args.solicitationData;
|
|
44
|
+
if (args.incumbentData)
|
|
45
|
+
body.incumbentData = args.incumbentData;
|
|
46
|
+
const { data, disclaimer } = await api.post("/score-go-no-go", body);
|
|
47
|
+
const blockers = data.blockers ?? [];
|
|
48
|
+
const lines = [
|
|
49
|
+
`Recommendation: ${data.recommendation ?? "n/a"} (score ${data.score ?? "n/a"}/100)`,
|
|
50
|
+
blockers.length > 0
|
|
51
|
+
? `Blockers (${blockers.length}):\n${blockers
|
|
52
|
+
.map((b) => ` • ${b.type ?? "blocker"}: ${b.message ?? b.reason ?? ""}`.trimEnd())
|
|
53
|
+
.join("\n")}`
|
|
54
|
+
: "Blockers: none",
|
|
55
|
+
data.reasons && data.reasons.length > 0
|
|
56
|
+
? `Key reasons:\n${data.reasons.slice(0, 8).map((r) => ` • ${r}`).join("\n")}`
|
|
57
|
+
: null,
|
|
58
|
+
disclaimer ? `\n${disclaimer}` : null,
|
|
59
|
+
].filter((s) => s !== null);
|
|
60
|
+
return {
|
|
61
|
+
content: [{ type: "text", text: lines.join("\n") }],
|
|
62
|
+
structuredContent: data,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=scoreGoNoGo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scoreGoNoGo.js","sourceRoot":"","sources":["../../src/tools/scoreGoNoGo.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "govtoolspro-mcp-server",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"mcpName": "io.github.smythmyke/govtoolspro-mcp-server",
|
|
5
|
+
"description": "MCP server for GovToolsPro — go/no-go scoring, incumbent intelligence, teaming-partner search, recompete prediction, Navy NECO lookup, and SAM.gov solicitation retrieval for federal contractors, from Claude Code, Claude Desktop, and Cursor.",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"bin": {
|
|
9
|
+
"govtoolspro-mcp-server": "dist/index.js"
|
|
10
|
+
},
|
|
11
|
+
"main": "dist/index.js",
|
|
12
|
+
"files": [
|
|
13
|
+
"dist",
|
|
14
|
+
"README.md"
|
|
15
|
+
],
|
|
16
|
+
"scripts": {
|
|
17
|
+
"build": "tsc",
|
|
18
|
+
"build:watch": "tsc --watch",
|
|
19
|
+
"start": "node dist/index.js",
|
|
20
|
+
"smoke": "node scripts/smoke-test.mjs",
|
|
21
|
+
"gen:manifests": "node scripts/gen-manifests.mjs",
|
|
22
|
+
"prepublishOnly": "npm run build"
|
|
23
|
+
},
|
|
24
|
+
"dependencies": {
|
|
25
|
+
"@modelcontextprotocol/sdk": "^1.0.0"
|
|
26
|
+
},
|
|
27
|
+
"devDependencies": {
|
|
28
|
+
"@types/node": "^22.0.0",
|
|
29
|
+
"typescript": "^5.3.0"
|
|
30
|
+
},
|
|
31
|
+
"engines": {
|
|
32
|
+
"node": ">=18.0.0"
|
|
33
|
+
},
|
|
34
|
+
"keywords": [
|
|
35
|
+
"mcp",
|
|
36
|
+
"mcp-server",
|
|
37
|
+
"model-context-protocol",
|
|
38
|
+
"govcon",
|
|
39
|
+
"government-contracting",
|
|
40
|
+
"sam.gov",
|
|
41
|
+
"federal-contracting",
|
|
42
|
+
"go-no-go",
|
|
43
|
+
"incumbent",
|
|
44
|
+
"recompete",
|
|
45
|
+
"govtoolspro"
|
|
46
|
+
],
|
|
47
|
+
"repository": {
|
|
48
|
+
"type": "git",
|
|
49
|
+
"url": "https://github.com/smythmyke/govtoolspro-mcp-server"
|
|
50
|
+
},
|
|
51
|
+
"homepage": "https://github.com/smythmyke/govtoolspro-mcp-server"
|
|
52
|
+
}
|