@oga-mcp/server 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 +137 -0
- package/dist/api-client.d.ts +255 -0
- package/dist/api-client.js +260 -0
- package/dist/api-client.js.map +1 -0
- package/dist/methodology-data.d.ts +40 -0
- package/dist/methodology-data.js +179 -0
- package/dist/methodology-data.js.map +1 -0
- package/dist/server.d.ts +28 -0
- package/dist/server.js +173 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/area-brief-audiences.d.ts +40 -0
- package/dist/tools/area-brief-audiences.js +131 -0
- package/dist/tools/area-brief-audiences.js.map +1 -0
- package/dist/tools/area-brief-format.d.ts +15 -0
- package/dist/tools/area-brief-format.js +142 -0
- package/dist/tools/area-brief-format.js.map +1 -0
- package/dist/tools/area-brief.d.ts +48 -0
- package/dist/tools/area-brief.js +82 -0
- package/dist/tools/area-brief.js.map +1 -0
- package/dist/tools/compare-postcodes.d.ts +57 -0
- package/dist/tools/compare-postcodes.js +148 -0
- package/dist/tools/compare-postcodes.js.map +1 -0
- package/dist/tools/engine-version.d.ts +23 -0
- package/dist/tools/engine-version.js +35 -0
- package/dist/tools/engine-version.js.map +1 -0
- package/dist/tools/find-areas.d.ts +38 -0
- package/dist/tools/find-areas.js +58 -0
- package/dist/tools/find-areas.js.map +1 -0
- package/dist/tools/find-peers.d.ts +44 -0
- package/dist/tools/find-peers.js +77 -0
- package/dist/tools/find-peers.js.map +1 -0
- package/dist/tools/get-area-signals.d.ts +39 -0
- package/dist/tools/get-area-signals.js +60 -0
- package/dist/tools/get-area-signals.js.map +1 -0
- package/dist/tools/get-portfolio-changes.d.ts +58 -0
- package/dist/tools/get-portfolio-changes.js +121 -0
- package/dist/tools/get-portfolio-changes.js.map +1 -0
- package/dist/tools/get-signals-by-category.d.ts +44 -0
- package/dist/tools/get-signals-by-category.js +67 -0
- package/dist/tools/get-signals-by-category.js.map +1 -0
- package/dist/tools/intelligence-format.d.ts +28 -0
- package/dist/tools/intelligence-format.js +197 -0
- package/dist/tools/intelligence-format.js.map +1 -0
- package/dist/tools/methodology-for.d.ts +34 -0
- package/dist/tools/methodology-for.js +71 -0
- package/dist/tools/methodology-for.js.map +1 -0
- package/dist/tools/score-postcode.d.ts +48 -0
- package/dist/tools/score-postcode.js +108 -0
- package/dist/tools/score-postcode.js.map +1 -0
- package/dist/tools/signals-format.d.ts +11 -0
- package/dist/tools/signals-format.js +116 -0
- package/dist/tools/signals-format.js.map +1 -0
- package/dist/tools/watch-portfolio.d.ts +50 -0
- package/dist/tools/watch-portfolio.js +126 -0
- package/dist/tools/watch-portfolio.js.map +1 -0
- package/package.json +48 -0
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP tool: watch_portfolio (AR-368)
|
|
3
|
+
*
|
|
4
|
+
* One-shot setup for a Monitor portfolio: creates the portfolio and adds
|
|
5
|
+
* the tracked areas in a single call so the LLM can set up watching
|
|
6
|
+
* conversationally. Wraps POST /v1/portfolios + POST /v1/portfolios/:id/areas
|
|
7
|
+
* sequentially.
|
|
8
|
+
*
|
|
9
|
+
* Failure handling: if the create succeeds but the add fails, the response
|
|
10
|
+
* still surfaces the new portfolio_id with `areas_added: 0` so the LLM can
|
|
11
|
+
* tell the user "the portfolio exists but no areas were added; retry with..."
|
|
12
|
+
*/
|
|
13
|
+
import type { OogaApiClient } from "../api-client.js";
|
|
14
|
+
export declare const watchPortfolioToolName = "watch_portfolio";
|
|
15
|
+
export declare const watchPortfolioToolDef: {
|
|
16
|
+
readonly name: "watch_portfolio";
|
|
17
|
+
readonly description: string;
|
|
18
|
+
readonly inputSchema: {
|
|
19
|
+
readonly type: "object";
|
|
20
|
+
readonly properties: {
|
|
21
|
+
readonly name: {
|
|
22
|
+
readonly type: "string";
|
|
23
|
+
readonly description: "Display name for the portfolio. 1-200 characters.";
|
|
24
|
+
};
|
|
25
|
+
readonly areas: {
|
|
26
|
+
readonly type: "array";
|
|
27
|
+
readonly items: {
|
|
28
|
+
readonly type: "string";
|
|
29
|
+
};
|
|
30
|
+
readonly minItems: 1;
|
|
31
|
+
readonly maxItems: 100;
|
|
32
|
+
readonly description: "UK postcodes or place names to track. 1-100 entries.";
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
readonly required: readonly ["name", "areas"];
|
|
36
|
+
readonly additionalProperties: false;
|
|
37
|
+
};
|
|
38
|
+
};
|
|
39
|
+
export interface WatchPortfolioArgs {
|
|
40
|
+
name: string;
|
|
41
|
+
areas: string[];
|
|
42
|
+
}
|
|
43
|
+
export declare function parseWatchPortfolioArgs(raw: unknown): WatchPortfolioArgs;
|
|
44
|
+
export declare function executeWatchPortfolio(client: OogaApiClient, args: WatchPortfolioArgs): Promise<{
|
|
45
|
+
content: Array<{
|
|
46
|
+
type: "text";
|
|
47
|
+
text: string;
|
|
48
|
+
}>;
|
|
49
|
+
isError?: boolean;
|
|
50
|
+
}>;
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP tool: watch_portfolio (AR-368)
|
|
3
|
+
*
|
|
4
|
+
* One-shot setup for a Monitor portfolio: creates the portfolio and adds
|
|
5
|
+
* the tracked areas in a single call so the LLM can set up watching
|
|
6
|
+
* conversationally. Wraps POST /v1/portfolios + POST /v1/portfolios/:id/areas
|
|
7
|
+
* sequentially.
|
|
8
|
+
*
|
|
9
|
+
* Failure handling: if the create succeeds but the add fails, the response
|
|
10
|
+
* still surfaces the new portfolio_id with `areas_added: 0` so the LLM can
|
|
11
|
+
* tell the user "the portfolio exists but no areas were added; retry with..."
|
|
12
|
+
*/
|
|
13
|
+
import { OogaApiError } from "../api-client.js";
|
|
14
|
+
export const watchPortfolioToolName = "watch_portfolio";
|
|
15
|
+
const MAX_AREAS_PER_CALL = 100;
|
|
16
|
+
export const watchPortfolioToolDef = {
|
|
17
|
+
name: watchPortfolioToolName,
|
|
18
|
+
description: "Set up a Monitor portfolio in one step: creates a named portfolio and adds tracked UK areas. " +
|
|
19
|
+
"Use this when the LLM is helping a user watch a list of postcodes or place names over time. " +
|
|
20
|
+
"After this succeeds, use get_portfolio_changes(portfolio_id) to check for material signal moves between periods.",
|
|
21
|
+
inputSchema: {
|
|
22
|
+
type: "object",
|
|
23
|
+
properties: {
|
|
24
|
+
name: {
|
|
25
|
+
type: "string",
|
|
26
|
+
description: "Display name for the portfolio. 1-200 characters.",
|
|
27
|
+
},
|
|
28
|
+
areas: {
|
|
29
|
+
type: "array",
|
|
30
|
+
items: { type: "string" },
|
|
31
|
+
minItems: 1,
|
|
32
|
+
maxItems: MAX_AREAS_PER_CALL,
|
|
33
|
+
description: `UK postcodes or place names to track. 1-${MAX_AREAS_PER_CALL} entries.`,
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
required: ["name", "areas"],
|
|
37
|
+
additionalProperties: false,
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
export function parseWatchPortfolioArgs(raw) {
|
|
41
|
+
if (typeof raw !== "object" || raw === null) {
|
|
42
|
+
throw new Error("watch_portfolio arguments must be an object");
|
|
43
|
+
}
|
|
44
|
+
const obj = raw;
|
|
45
|
+
const name = obj.name;
|
|
46
|
+
const areas = obj.areas;
|
|
47
|
+
if (typeof name !== "string" || name.trim().length === 0) {
|
|
48
|
+
throw new Error("name must be a non-empty string");
|
|
49
|
+
}
|
|
50
|
+
if (name.length > 200) {
|
|
51
|
+
throw new Error("name must be 200 characters or fewer");
|
|
52
|
+
}
|
|
53
|
+
if (!Array.isArray(areas) || areas.length === 0) {
|
|
54
|
+
throw new Error("areas must be a non-empty array");
|
|
55
|
+
}
|
|
56
|
+
if (areas.length > MAX_AREAS_PER_CALL) {
|
|
57
|
+
throw new Error(`areas must contain at most ${MAX_AREAS_PER_CALL} entries`);
|
|
58
|
+
}
|
|
59
|
+
const cleaned = [];
|
|
60
|
+
for (const a of areas) {
|
|
61
|
+
if (typeof a !== "string" || a.trim().length === 0) {
|
|
62
|
+
throw new Error("every area must be a non-empty string");
|
|
63
|
+
}
|
|
64
|
+
if (a.length > 100) {
|
|
65
|
+
throw new Error("each area must be 100 characters or fewer");
|
|
66
|
+
}
|
|
67
|
+
cleaned.push(a.trim());
|
|
68
|
+
}
|
|
69
|
+
return { name: name.trim(), areas: cleaned };
|
|
70
|
+
}
|
|
71
|
+
function formatPortfolioSetup(created, added, addError) {
|
|
72
|
+
const lines = [];
|
|
73
|
+
lines.push(`# Portfolio: ${created.name}`);
|
|
74
|
+
lines.push(`**ID:** \`${created.id}\``);
|
|
75
|
+
if (created.created_at)
|
|
76
|
+
lines.push(`**Created:** ${created.created_at}`);
|
|
77
|
+
lines.push("");
|
|
78
|
+
if (added !== null) {
|
|
79
|
+
lines.push(`**Areas tracked (${added.areas.length}):**`);
|
|
80
|
+
for (const a of added.areas) {
|
|
81
|
+
const label = a.label ? ` — ${a.label}` : "";
|
|
82
|
+
lines.push(`- ${a.area}${label}`);
|
|
83
|
+
}
|
|
84
|
+
lines.push("");
|
|
85
|
+
lines.push(`Use \`get_portfolio_changes\` with portfolio_id \`${created.id}\` to check for material signal moves.`);
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
lines.push("**Areas tracked: 0**");
|
|
89
|
+
lines.push("");
|
|
90
|
+
lines.push(`The portfolio was created but the area-add step failed: ${addError ?? "unknown error"}.`);
|
|
91
|
+
lines.push(`Retry by calling watch_portfolio with the same name and the same areas (the duplicate portfolio is harmless to leave; or delete it via the dashboard).`);
|
|
92
|
+
}
|
|
93
|
+
return lines.join("\n").trimEnd();
|
|
94
|
+
}
|
|
95
|
+
export async function executeWatchPortfolio(client, args) {
|
|
96
|
+
let created;
|
|
97
|
+
try {
|
|
98
|
+
created = await client.createPortfolio(args.name);
|
|
99
|
+
}
|
|
100
|
+
catch (err) {
|
|
101
|
+
if (err instanceof OogaApiError) {
|
|
102
|
+
const msg = `OneGoodArea API error (HTTP ${err.status ?? "?"}) creating portfolio: ${err.message}`;
|
|
103
|
+
return { content: [{ type: "text", text: msg }], isError: true };
|
|
104
|
+
}
|
|
105
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
106
|
+
return { content: [{ type: "text", text: `Tool error: ${msg}` }], isError: true };
|
|
107
|
+
}
|
|
108
|
+
/* Phase 2 — add areas. If it fails, the portfolio exists empty; surface
|
|
109
|
+
that so the LLM can act rather than swallowing the create. */
|
|
110
|
+
try {
|
|
111
|
+
const added = await client.addPortfolioAreas(created.id, args.areas.map((a) => ({ area: a })));
|
|
112
|
+
return { content: [{ type: "text", text: formatPortfolioSetup(created, added, null) }] };
|
|
113
|
+
}
|
|
114
|
+
catch (err) {
|
|
115
|
+
const msg = err instanceof OogaApiError
|
|
116
|
+
? `HTTP ${err.status ?? "?"}: ${err.message}`
|
|
117
|
+
: err instanceof Error
|
|
118
|
+
? err.message
|
|
119
|
+
: String(err);
|
|
120
|
+
return {
|
|
121
|
+
content: [{ type: "text", text: formatPortfolioSetup(created, null, msg) }],
|
|
122
|
+
isError: true,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=watch-portfolio.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watch-portfolio.js","sourceRoot":"","sources":["../../src/tools/watch-portfolio.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@oga-mcp/server",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "MCP server for OneGoodArea — UK area intelligence inside Claude Desktop, Cursor, and any MCP-compatible client. Returns server-composed briefs (summary + per-dimension reasoning + confidence + data sources) from the deterministic engine.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"homepage": "https://www.onegoodarea.com/docs/mcp",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/OneGoodArea/OneGoodArea.git",
|
|
10
|
+
"directory": "mcp"
|
|
11
|
+
},
|
|
12
|
+
"type": "module",
|
|
13
|
+
"main": "dist/server.js",
|
|
14
|
+
"bin": {
|
|
15
|
+
"oga-mcp": "dist/server.js"
|
|
16
|
+
},
|
|
17
|
+
"files": [
|
|
18
|
+
"dist",
|
|
19
|
+
"README.md"
|
|
20
|
+
],
|
|
21
|
+
"scripts": {
|
|
22
|
+
"build": "tsc",
|
|
23
|
+
"dev": "tsx src/server.ts",
|
|
24
|
+
"test": "vitest run",
|
|
25
|
+
"prepublishOnly": "npm run build"
|
|
26
|
+
},
|
|
27
|
+
"dependencies": {
|
|
28
|
+
"@modelcontextprotocol/sdk": "^1.29.0"
|
|
29
|
+
},
|
|
30
|
+
"devDependencies": {
|
|
31
|
+
"@types/node": "^25.7.0",
|
|
32
|
+
"tsx": "^4.19.0",
|
|
33
|
+
"typescript": "^6.0.3",
|
|
34
|
+
"vitest": "^4.1.6"
|
|
35
|
+
},
|
|
36
|
+
"engines": {
|
|
37
|
+
"node": ">=18"
|
|
38
|
+
},
|
|
39
|
+
"keywords": [
|
|
40
|
+
"mcp",
|
|
41
|
+
"model-context-protocol",
|
|
42
|
+
"onegoodarea",
|
|
43
|
+
"uk",
|
|
44
|
+
"location-intelligence",
|
|
45
|
+
"property",
|
|
46
|
+
"postcode"
|
|
47
|
+
]
|
|
48
|
+
}
|