@4ort/cli 0.4.0 → 0.5.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 +286 -0
- package/dist/commands/kg/agent-context.d.ts +3 -0
- package/dist/commands/kg/agent-context.js +54 -0
- package/dist/commands/kg/agent-context.js.map +1 -0
- package/dist/commands/kg/article-context.d.ts +3 -0
- package/dist/commands/kg/article-context.js +51 -0
- package/dist/commands/kg/article-context.js.map +1 -0
- package/dist/commands/kg/ask.d.ts +5 -0
- package/dist/commands/kg/ask.js +121 -0
- package/dist/commands/kg/ask.js.map +1 -0
- package/dist/commands/kg/auth.d.ts +9 -0
- package/dist/commands/kg/auth.js +95 -0
- package/dist/commands/kg/auth.js.map +1 -0
- package/dist/commands/kg/entity.d.ts +4 -0
- package/dist/commands/kg/entity.js +33 -0
- package/dist/commands/kg/entity.js.map +1 -0
- package/dist/commands/kg/match.d.ts +5 -0
- package/dist/commands/kg/match.js +44 -0
- package/dist/commands/kg/match.js.map +1 -0
- package/dist/commands/kg/popularity.d.ts +3 -0
- package/dist/commands/kg/popularity.js +42 -0
- package/dist/commands/kg/popularity.js.map +1 -0
- package/dist/commands/kg/search.d.ts +4 -0
- package/dist/commands/kg/search.js +34 -0
- package/dist/commands/kg/search.js.map +1 -0
- package/dist/commands/kg/trending.d.ts +6 -0
- package/dist/commands/kg/trending.js +35 -0
- package/dist/commands/kg/trending.js.map +1 -0
- package/dist/commands/mcp.d.ts +5 -0
- package/dist/commands/mcp.js +24 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/run.d.ts +10 -0
- package/dist/commands/run.js +74 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/search.d.ts +7 -0
- package/dist/commands/search.js +105 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/vault.d.ts +7 -0
- package/dist/commands/vault.js +62 -0
- package/dist/commands/vault.js.map +1 -0
- package/dist/commands/web.d.ts +6 -0
- package/dist/commands/web.js +44 -0
- package/dist/commands/web.js.map +1 -0
- package/dist/config.d.ts +25 -0
- package/dist/config.js +80 -1
- package/dist/config.js.map +1 -1
- package/dist/index.js +167 -37
- package/dist/index.js.map +1 -1
- package/dist/kg-client.d.ts +42 -0
- package/dist/kg-client.js +125 -0
- package/dist/kg-client.js.map +1 -0
- package/dist/kg-output.d.ts +33 -0
- package/dist/kg-output.js +132 -0
- package/dist/kg-output.js.map +1 -0
- package/dist/mcp-server.d.ts +5 -0
- package/dist/mcp-server.js +363 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/web-client.d.ts +20 -0
- package/dist/web-client.js +335 -0
- package/dist/web-client.js.map +1 -0
- package/package.json +20 -4
- package/src/api-client.ts +0 -51
- package/src/commands/delete.ts +0 -15
- package/src/commands/list.ts +0 -25
- package/src/commands/mail.ts +0 -79
- package/src/commands/provision.ts +0 -106
- package/src/commands/push.ts +0 -63
- package/src/commands/recover.ts +0 -37
- package/src/commands/register.ts +0 -40
- package/src/commands/whoami.ts +0 -20
- package/src/config.ts +0 -40
- package/src/index.ts +0 -114
- package/tsconfig.json +0 -8
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Output helpers for KG commands.
|
|
3
|
+
*
|
|
4
|
+
* Default: human-readable, simple text-aligned tables, no color deps.
|
|
5
|
+
* --json flag (handled per-command): straight JSON.stringify with indent.
|
|
6
|
+
* Markdown rendering: TTY → ANSI escape codes, pipe → raw, --plain → stripped.
|
|
7
|
+
*/
|
|
8
|
+
// ─────────────────────────────────────────────────────────────────────
|
|
9
|
+
// Markdown rendering
|
|
10
|
+
// ─────────────────────────────────────────────────────────────────────
|
|
11
|
+
const ANSI = {
|
|
12
|
+
bold: "\x1b[1m",
|
|
13
|
+
italic: "\x1b[3m",
|
|
14
|
+
cyan: "\x1b[36m",
|
|
15
|
+
dim: "\x1b[2m",
|
|
16
|
+
reset: "\x1b[0m",
|
|
17
|
+
};
|
|
18
|
+
/** Pick render mode from CLI flags + TTY detection. */
|
|
19
|
+
export function pickRenderMode(plain) {
|
|
20
|
+
if (plain)
|
|
21
|
+
return "plain";
|
|
22
|
+
if (process.stdout.isTTY)
|
|
23
|
+
return "ansi";
|
|
24
|
+
return "raw";
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Apply markdown → ANSI (or strip in plain mode). Handles **bold**, *italic*,
|
|
28
|
+
* _italic_, and `code` inline. Does not touch citation refs like [11].
|
|
29
|
+
*
|
|
30
|
+
* Order matters: `**bold**` is replaced first so the leftover `*italic*`
|
|
31
|
+
* regex doesn't double-match.
|
|
32
|
+
*/
|
|
33
|
+
export function renderMarkdown(text, mode) {
|
|
34
|
+
if (mode === "raw")
|
|
35
|
+
return text;
|
|
36
|
+
if (mode === "plain") {
|
|
37
|
+
return text
|
|
38
|
+
.replace(/\*\*(.+?)\*\*/g, "$1")
|
|
39
|
+
.replace(/\*(.+?)\*/g, "$1")
|
|
40
|
+
.replace(/_(.+?)_/g, "$1")
|
|
41
|
+
.replace(/`(.+?)`/g, "$1");
|
|
42
|
+
}
|
|
43
|
+
return text
|
|
44
|
+
.replace(/\*\*(.+?)\*\*/g, `${ANSI.bold}$1${ANSI.reset}`)
|
|
45
|
+
.replace(/\*(.+?)\*/g, `${ANSI.italic}$1${ANSI.reset}`)
|
|
46
|
+
.replace(/_(.+?)_/g, `${ANSI.italic}$1${ANSI.reset}`)
|
|
47
|
+
.replace(/`(.+?)`/g, `${ANSI.cyan}$1${ANSI.reset}`);
|
|
48
|
+
}
|
|
49
|
+
/** Wrap a heading line in ANSI bold for TTY output. */
|
|
50
|
+
export function styleHeading(text, mode) {
|
|
51
|
+
if (mode === "ansi")
|
|
52
|
+
return `${ANSI.bold}${text}${ANSI.reset}`;
|
|
53
|
+
return text;
|
|
54
|
+
}
|
|
55
|
+
export function printJson(data) {
|
|
56
|
+
process.stdout.write(JSON.stringify(data, null, 2) + "\n");
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Render a list of objects as a column-aligned text table.
|
|
60
|
+
* `columns` is an ordered list of [header, accessor] pairs.
|
|
61
|
+
*/
|
|
62
|
+
export function printTable(rows, columns) {
|
|
63
|
+
if (rows.length === 0) {
|
|
64
|
+
console.log("(no results)");
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
const headers = columns.map(([h]) => h);
|
|
68
|
+
const data = rows.map((row) => columns.map(([, fn]) => {
|
|
69
|
+
const v = fn(row);
|
|
70
|
+
return v === undefined || v === null ? "" : String(v);
|
|
71
|
+
}));
|
|
72
|
+
const widths = headers.map((h, i) => Math.max(h.length, ...data.map((r) => r[i].length)));
|
|
73
|
+
const formatRow = (cells) => cells.map((c, i) => c.padEnd(widths[i])).join(" ");
|
|
74
|
+
console.log(formatRow(headers));
|
|
75
|
+
console.log(widths.map((w) => "─".repeat(w)).join(" "));
|
|
76
|
+
for (const row of data)
|
|
77
|
+
console.log(formatRow(row));
|
|
78
|
+
}
|
|
79
|
+
export function truncate(s, max) {
|
|
80
|
+
if (!s)
|
|
81
|
+
return "";
|
|
82
|
+
return s.length <= max ? s : s.slice(0, max - 1) + "…";
|
|
83
|
+
}
|
|
84
|
+
/** Pretty-format an integer with thousands separators. */
|
|
85
|
+
export function fmtInt(n) {
|
|
86
|
+
if (n === null || n === undefined)
|
|
87
|
+
return "—";
|
|
88
|
+
return Math.round(n).toLocaleString("en-US");
|
|
89
|
+
}
|
|
90
|
+
/** Pretty-format a float with one decimal, e.g. 1.3 → "1.3". */
|
|
91
|
+
export function fmtFloat(n, digits = 2) {
|
|
92
|
+
if (n === null || n === undefined)
|
|
93
|
+
return "—";
|
|
94
|
+
return n.toFixed(digits);
|
|
95
|
+
}
|
|
96
|
+
/** Print an entity card in the human-readable view. */
|
|
97
|
+
export function printEntity(e) {
|
|
98
|
+
console.log(`${e.name}${e.type ? ` (${e.type})` : ""}`);
|
|
99
|
+
if (e.slug)
|
|
100
|
+
console.log(` slug: ${e.slug}`);
|
|
101
|
+
if (e.wikidata_id)
|
|
102
|
+
console.log(` wikidata: ${e.wikidata_id}`);
|
|
103
|
+
if (e.domain)
|
|
104
|
+
console.log(` domain: ${e.domain}`);
|
|
105
|
+
if (e.description)
|
|
106
|
+
console.log(` description: ${truncate(e.description, 200)}`);
|
|
107
|
+
if (e.summary)
|
|
108
|
+
console.log(` summary: ${truncate(e.summary, 300)}`);
|
|
109
|
+
if (e.popularity?.monthly_pageviews !== undefined) {
|
|
110
|
+
console.log(` monthly views: ${fmtInt(e.popularity.monthly_pageviews)}`);
|
|
111
|
+
}
|
|
112
|
+
if (Array.isArray(e.facts) && e.facts.length > 0) {
|
|
113
|
+
console.log(`\n facts (${e.facts.length}):`);
|
|
114
|
+
for (const f of e.facts.slice(0, 10)) {
|
|
115
|
+
const verified = f.verified ? " ✓" : "";
|
|
116
|
+
console.log(` ${f.predicate_label || f.predicate}: ${f.value}${verified}`);
|
|
117
|
+
}
|
|
118
|
+
if (e.facts.length > 10)
|
|
119
|
+
console.log(` … ${e.facts.length - 10} more`);
|
|
120
|
+
}
|
|
121
|
+
if (Array.isArray(e.relationships) && e.relationships.length > 0) {
|
|
122
|
+
console.log(`\n relationships (${e.relationships.length}):`);
|
|
123
|
+
for (const r of e.relationships.slice(0, 10)) {
|
|
124
|
+
console.log(` ${r.predicate_label || r.predicate} → ${r.target_name}`);
|
|
125
|
+
}
|
|
126
|
+
if (e.relationships.length > 10)
|
|
127
|
+
console.log(` … ${e.relationships.length - 10} more`);
|
|
128
|
+
}
|
|
129
|
+
if (e.license)
|
|
130
|
+
console.log(`\n license: ${e.license}`);
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=kg-output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kg-output.js","sourceRoot":"","sources":["../src/kg-output.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `4ort mcp` — the 4ort MCP server. Two transports, one set of tools:
|
|
3
|
+
* • `4ort mcp` (stdio) — for Claude Desktop / local clients that spawn it
|
|
4
|
+
* • `4ort mcp serve` (HTTP) — Streamable HTTP, deploy behind a reverse proxy
|
|
5
|
+
* → mcp.4ort.xyz (public)
|
|
6
|
+
*
|
|
7
|
+
* Tools wrap the same logic the CLI commands use (smart-router search, the web
|
|
8
|
+
* reader, KG entity/match/agent-context) — they call kgRequest / webRead
|
|
9
|
+
* directly (NOT the CLI command wrappers, which print to stdout and exit).
|
|
10
|
+
*/
|
|
11
|
+
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
12
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
13
|
+
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
|
|
14
|
+
import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
|
|
15
|
+
import { createServer } from "node:http";
|
|
16
|
+
import { optionalKgConfig } from "./config.js";
|
|
17
|
+
import { kgRequest } from "./kg-client.js";
|
|
18
|
+
import { webRead } from "./web-client.js";
|
|
19
|
+
const VERSION = "0.5.0-dev";
|
|
20
|
+
const TOOLS = [
|
|
21
|
+
{
|
|
22
|
+
name: "kg_search",
|
|
23
|
+
description: "Smart router / front door. Given a query, returns: the canonical 4ort.xyz knowledge-graph entity it names (if any) plus that entity's official site & verified social links; a curated 'phonebook' of authoritative-source search URLs for the detected vertical (Wikipedia, TMDB, OpenAlex, SEC EDGAR, GitHub, MusicBrainz, …) that you then fetch with web_get; and ranked hits from our Common Crawl web index. Use this FIRST to decide where to look next. No auth required.",
|
|
24
|
+
inputSchema: {
|
|
25
|
+
type: "object",
|
|
26
|
+
properties: {
|
|
27
|
+
query: { type: "string", description: "The search query." },
|
|
28
|
+
limit_pages: { type: "integer", description: "Max web-index hits (default 15)." },
|
|
29
|
+
limit_sources: { type: "integer", description: "Max phonebook routes (default 12)." },
|
|
30
|
+
},
|
|
31
|
+
required: ["query"],
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
name: "web_get",
|
|
36
|
+
description: "Fetch a URL and return its readable text (Reader-Mode extraction — no browser, no JS). If the URL is a 4ort.xyz entity page, returns the structured entity instead of scraping. On a bot wall / 403 / paywall / PDF / binary body it returns ok:false WITH the URL so you can fall back. Use this to read phonebook routes from kg_search, web-index hits, or any arbitrary page.",
|
|
37
|
+
inputSchema: {
|
|
38
|
+
type: "object",
|
|
39
|
+
properties: {
|
|
40
|
+
url: { type: "string", description: "Absolute http(s) URL." },
|
|
41
|
+
max_chars: { type: "integer", description: "Cap on extracted text length (default 50000)." },
|
|
42
|
+
},
|
|
43
|
+
required: ["url"],
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
name: "kg_entity",
|
|
48
|
+
description: "Fetch one 4ort.xyz knowledge-graph entity by slug, UUID, or Wikidata Q-id. detail: tiny | small | medium | full (full includes facts, relationships/connections, citations). Use this to 'walk the graph' once you have an entity (e.g. from kg_search). Requires a 4ort.xyz API key on the server.",
|
|
49
|
+
inputSchema: {
|
|
50
|
+
type: "object",
|
|
51
|
+
properties: {
|
|
52
|
+
key: { type: "string", description: "Entity slug, UUID, or Q-id." },
|
|
53
|
+
detail: { type: "string", enum: ["tiny", "small", "medium", "full"], description: "Default: medium." },
|
|
54
|
+
},
|
|
55
|
+
required: ["key"],
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
name: "kg_match",
|
|
60
|
+
description: "Resolve a free-text string to its canonical 4ort.xyz knowledge-graph entity (entity linking / disambiguation). Returns ranked candidates with slug, type, and confidence. Requires a 4ort.xyz API key on the server.",
|
|
61
|
+
inputSchema: {
|
|
62
|
+
type: "object",
|
|
63
|
+
properties: {
|
|
64
|
+
text: { type: "string", description: "The string to resolve." },
|
|
65
|
+
limit: { type: "integer", description: "Max candidates (default 5)." },
|
|
66
|
+
entity_types: { type: "string", description: "Optional comma-separated entity-type filter." },
|
|
67
|
+
},
|
|
68
|
+
required: ["text"],
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
name: "kg_agent_context",
|
|
73
|
+
description: "Memory-bank bundle for an autonomous agent about one entity: short + long summaries, facts grouped by predicate, key connected actors, world context (country / domain rank / monthly views). Requires a 4ort.xyz API key on the server.",
|
|
74
|
+
inputSchema: {
|
|
75
|
+
type: "object",
|
|
76
|
+
properties: { key: { type: "string", description: "Entity slug, UUID, or Q-id." } },
|
|
77
|
+
required: ["key"],
|
|
78
|
+
},
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
name: "kg_article_context",
|
|
82
|
+
description: "Fat bundle of facts + writing hooks for an SEO writer about one entity: full entity card PLUS deduplicated citations across all facts, last-7-day Wikidata edit narrative, popularity signals, top connections, and 3-5 LLM-synthesized writing hooks ('recently controversial because X' / 'top-3 in domain Y'). Use this when you're about to draft an article. Requires a 4ort.xyz API key on the server.",
|
|
83
|
+
inputSchema: {
|
|
84
|
+
type: "object",
|
|
85
|
+
properties: { key: { type: "string", description: "Entity slug, UUID, or Q-id." } },
|
|
86
|
+
required: ["key"],
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
name: "kg_popularity",
|
|
91
|
+
description: "Real-world popularity score for an entity, derived from measured Wikipedia pageviews — a free CC0 alternative to Google Keyword Planner / Ahrefs / SEMrush. Returns current monthly volume, 12-month trend, 30-day daily breakdown, year-over-year change, country mix, and rank within the entity's domain. Requires a 4ort.xyz API key on the server.",
|
|
92
|
+
inputSchema: {
|
|
93
|
+
type: "object",
|
|
94
|
+
properties: { key: { type: "string", description: "Entity slug, UUID, or Q-id." } },
|
|
95
|
+
required: ["key"],
|
|
96
|
+
},
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
name: "kg_trending",
|
|
100
|
+
description: "What's trending RIGHT NOW on Wikipedia — live attention signal from hourly pageview deltas. Use to answer 'what's hot' / 'what are people reading about' / 'news today' type questions. Updated continuously. Requires a 4ort.xyz API key on the server.",
|
|
101
|
+
inputSchema: {
|
|
102
|
+
type: "object",
|
|
103
|
+
properties: {
|
|
104
|
+
period: { type: "string", enum: ["hour", "day", "week"], description: "Trend window. Default: day." },
|
|
105
|
+
country: { type: "string", description: "ISO 3166 alpha-2 (e.g. 'US', 'DE', 'JP') to filter to one country. Omit for global." },
|
|
106
|
+
category: { type: "string", description: "Filter to one harvest_domain (e.g. 'people', 'companies', 'software'). Omit for all." },
|
|
107
|
+
rank_by: { type: "string", enum: ["views", "velocity", "novelty", "weird"], description: "views=raw (default), velocity=% increase vs baseline, novelty=new-to-trending, weird=chronically-popular entities (TLDs, country pages)." },
|
|
108
|
+
limit: { type: "integer", description: "Max entities (1-100, default 20)." },
|
|
109
|
+
},
|
|
110
|
+
},
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
name: "deep_research",
|
|
114
|
+
description: "Kick off a DEEP, multi-step research job — an autonomous multi-agent run that searches, reads 10+ sources, and synthesizes a cited markdown briefing. ASYNC + long-running (several minutes): returns a job_id IMMEDIATELY, then poll deep_research_result until status is 'done'. Use for open-ended 'research X and write me a sourced report' tasks — NOT quick lookups (use kg_search for those). Gated: requires an authorized bearer token.",
|
|
115
|
+
inputSchema: {
|
|
116
|
+
type: "object",
|
|
117
|
+
properties: {
|
|
118
|
+
query: { type: "string", description: "The research question / brief." },
|
|
119
|
+
depth: { type: "string", enum: ["quick", "standard", "deep"], description: "Effort level. Default: standard." },
|
|
120
|
+
},
|
|
121
|
+
required: ["query"],
|
|
122
|
+
},
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
name: "deep_research_result",
|
|
126
|
+
description: "Poll a deep_research job by its job_id. Returns { status: queued | running | done | error, progress, report (clean markdown, when done), citations, sources_read }. Call repeatedly (a few seconds apart) until status is 'done' or 'error'. Gated: requires an authorized bearer token.",
|
|
127
|
+
inputSchema: {
|
|
128
|
+
type: "object",
|
|
129
|
+
properties: { job_id: { type: "string", description: "The job_id returned by deep_research." } },
|
|
130
|
+
required: ["job_id"],
|
|
131
|
+
},
|
|
132
|
+
},
|
|
133
|
+
// kg_qa removed 2026-05-17 — the backing /api/v1/qa endpoint was
|
|
134
|
+
// deprecated. Live LLM synthesis didn't belong in the API request path.
|
|
135
|
+
// To revive: re-enable the qa.router in app/main.py first.
|
|
136
|
+
];
|
|
137
|
+
// Expensive/abusable tools gated at the HTTP transport (see runMcpHttp). The
|
|
138
|
+
// cheap read tools stay open for discovery; these burn tokens + minutes of
|
|
139
|
+
// compute per call, so they require a bearer token from DEEP_RESEARCH_KEYS.
|
|
140
|
+
const GATED_TOOLS = new Set(["deep_research", "deep_research_result"]);
|
|
141
|
+
function ok(data) {
|
|
142
|
+
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
143
|
+
}
|
|
144
|
+
function fail(message) {
|
|
145
|
+
return { content: [{ type: "text", text: JSON.stringify({ error: message }) }], isError: true };
|
|
146
|
+
}
|
|
147
|
+
/** Build a fresh MCP Server with the tool handlers wired. */
|
|
148
|
+
function buildServer() {
|
|
149
|
+
const server = new Server({ name: "4ort", version: VERSION }, { capabilities: { tools: {} } });
|
|
150
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: TOOLS }));
|
|
151
|
+
server.setRequestHandler(CallToolRequestSchema, async (req) => {
|
|
152
|
+
const name = req.params.name;
|
|
153
|
+
const args = (req.params.arguments ?? {});
|
|
154
|
+
try {
|
|
155
|
+
switch (name) {
|
|
156
|
+
case "kg_search": {
|
|
157
|
+
const data = await kgRequest(optionalKgConfig(), "/api/v1/route", {
|
|
158
|
+
query: {
|
|
159
|
+
q: String(args.query ?? ""),
|
|
160
|
+
limit_pages: typeof args.limit_pages === "number" ? args.limit_pages : 15,
|
|
161
|
+
limit_sources: typeof args.limit_sources === "number" ? args.limit_sources : 12,
|
|
162
|
+
},
|
|
163
|
+
});
|
|
164
|
+
return ok(data);
|
|
165
|
+
}
|
|
166
|
+
case "web_get": {
|
|
167
|
+
const url = String(args.url ?? "");
|
|
168
|
+
if (!url)
|
|
169
|
+
return fail("url is required");
|
|
170
|
+
const r = await webRead(url, { maxChars: typeof args.max_chars === "number" ? args.max_chars : undefined });
|
|
171
|
+
return ok(r);
|
|
172
|
+
}
|
|
173
|
+
case "kg_entity": {
|
|
174
|
+
const key = String(args.key ?? "");
|
|
175
|
+
if (!key)
|
|
176
|
+
return fail("key is required");
|
|
177
|
+
const data = await kgRequest(optionalKgConfig(), `/api/v1/entities/${encodeURIComponent(key)}`, {
|
|
178
|
+
query: { detail: args.detail ?? "medium" },
|
|
179
|
+
});
|
|
180
|
+
return ok(data);
|
|
181
|
+
}
|
|
182
|
+
case "kg_match": {
|
|
183
|
+
const text = String(args.text ?? "");
|
|
184
|
+
if (!text)
|
|
185
|
+
return fail("text is required");
|
|
186
|
+
const entity_types = typeof args.entity_types === "string" && args.entity_types.trim()
|
|
187
|
+
? args.entity_types.split(",").map((t) => t.trim()).filter(Boolean)
|
|
188
|
+
: undefined;
|
|
189
|
+
const data = await kgRequest(optionalKgConfig(), "/api/v1/match", {
|
|
190
|
+
method: "POST",
|
|
191
|
+
body: { text, entity_types, limit: typeof args.limit === "number" ? args.limit : 5 },
|
|
192
|
+
});
|
|
193
|
+
return ok(data);
|
|
194
|
+
}
|
|
195
|
+
case "kg_agent_context": {
|
|
196
|
+
const key = String(args.key ?? "");
|
|
197
|
+
if (!key)
|
|
198
|
+
return fail("key is required");
|
|
199
|
+
const data = await kgRequest(optionalKgConfig(), `/api/v1/entities/${encodeURIComponent(key)}/agent-context`);
|
|
200
|
+
return ok(data);
|
|
201
|
+
}
|
|
202
|
+
case "kg_article_context": {
|
|
203
|
+
const key = String(args.key ?? "");
|
|
204
|
+
if (!key)
|
|
205
|
+
return fail("key is required");
|
|
206
|
+
const data = await kgRequest(optionalKgConfig(), `/api/v1/entities/${encodeURIComponent(key)}/article-context`);
|
|
207
|
+
return ok(data);
|
|
208
|
+
}
|
|
209
|
+
case "kg_popularity": {
|
|
210
|
+
const key = String(args.key ?? "");
|
|
211
|
+
if (!key)
|
|
212
|
+
return fail("key is required");
|
|
213
|
+
const data = await kgRequest(optionalKgConfig(), `/api/v1/popularity/${encodeURIComponent(key)}`);
|
|
214
|
+
return ok(data);
|
|
215
|
+
}
|
|
216
|
+
case "kg_trending": {
|
|
217
|
+
const query = {};
|
|
218
|
+
if (typeof args.period === "string")
|
|
219
|
+
query.period = args.period;
|
|
220
|
+
if (typeof args.country === "string" && args.country)
|
|
221
|
+
query.country = args.country;
|
|
222
|
+
if (typeof args.category === "string" && args.category)
|
|
223
|
+
query.category = args.category;
|
|
224
|
+
if (typeof args.rank_by === "string")
|
|
225
|
+
query.rank_by = args.rank_by;
|
|
226
|
+
if (typeof args.limit === "number")
|
|
227
|
+
query.limit = args.limit;
|
|
228
|
+
const data = await kgRequest(optionalKgConfig(), "/api/v1/trending", { query });
|
|
229
|
+
return ok(data);
|
|
230
|
+
}
|
|
231
|
+
case "deep_research": {
|
|
232
|
+
const query = String(args.query ?? "");
|
|
233
|
+
if (!query)
|
|
234
|
+
return fail("query is required");
|
|
235
|
+
const data = await kgRequest(optionalKgConfig(), "/api/v1/research", {
|
|
236
|
+
method: "POST",
|
|
237
|
+
body: { query, depth: typeof args.depth === "string" ? args.depth : "standard" },
|
|
238
|
+
});
|
|
239
|
+
return ok(data);
|
|
240
|
+
}
|
|
241
|
+
case "deep_research_result": {
|
|
242
|
+
const job_id = String(args.job_id ?? "");
|
|
243
|
+
if (!job_id)
|
|
244
|
+
return fail("job_id is required");
|
|
245
|
+
const data = await kgRequest(optionalKgConfig(), `/api/v1/research/${encodeURIComponent(job_id)}`);
|
|
246
|
+
return ok(data);
|
|
247
|
+
}
|
|
248
|
+
// kg_qa case removed 2026-05-17 — see TOOLS array note above.
|
|
249
|
+
default:
|
|
250
|
+
return fail(`unknown tool: ${name}`);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
catch (e) {
|
|
254
|
+
return fail(e?.message ?? String(e));
|
|
255
|
+
}
|
|
256
|
+
});
|
|
257
|
+
return server;
|
|
258
|
+
}
|
|
259
|
+
// ── stdio transport (local: Claude Desktop spawns the process) ──────────────
|
|
260
|
+
export async function runMcpStdio() {
|
|
261
|
+
const server = buildServer();
|
|
262
|
+
await server.connect(new StdioServerTransport());
|
|
263
|
+
// Stays alive on stdio until the client disconnects.
|
|
264
|
+
}
|
|
265
|
+
// ── Streamable HTTP transport (hosted: behind a reverse proxy → mcp.4ort.xyz) ─
|
|
266
|
+
const MAX_REQUEST_BYTES = 1_000_000;
|
|
267
|
+
function sendJson(res, status, body) {
|
|
268
|
+
res.writeHead(status, { "content-type": "application/json" });
|
|
269
|
+
res.end(JSON.stringify(body));
|
|
270
|
+
}
|
|
271
|
+
export async function runMcpHttp(opts) {
|
|
272
|
+
const httpServer = createServer(async (req, res) => {
|
|
273
|
+
try {
|
|
274
|
+
const u = new URL(req.url ?? "/", `http://${req.headers.host ?? "localhost"}`);
|
|
275
|
+
// health / discovery
|
|
276
|
+
if (req.method === "GET" && (u.pathname === "/" || u.pathname === "/health")) {
|
|
277
|
+
return sendJson(res, 200, {
|
|
278
|
+
ok: true,
|
|
279
|
+
service: "4ort-mcp",
|
|
280
|
+
version: VERSION,
|
|
281
|
+
transport: "streamable-http",
|
|
282
|
+
endpoint: "/mcp",
|
|
283
|
+
tools: TOOLS.map((t) => t.name),
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
if (u.pathname !== "/mcp") {
|
|
287
|
+
return sendJson(res, 404, { error: "not found — the MCP endpoint is POST /mcp" });
|
|
288
|
+
}
|
|
289
|
+
if (req.method !== "POST") {
|
|
290
|
+
// Stateless server: no long-lived GET/SSE stream to resume.
|
|
291
|
+
res.setHeader("allow", "POST");
|
|
292
|
+
return sendJson(res, 405, { error: "method not allowed — POST /mcp with a JSON-RPC body" });
|
|
293
|
+
}
|
|
294
|
+
// read + parse the JSON-RPC body (we manage the body so we can cap it)
|
|
295
|
+
const chunks = [];
|
|
296
|
+
let total = 0;
|
|
297
|
+
for await (const c of req) {
|
|
298
|
+
const buf = c;
|
|
299
|
+
total += buf.length;
|
|
300
|
+
if (total > MAX_REQUEST_BYTES)
|
|
301
|
+
return sendJson(res, 413, { error: "request too large" });
|
|
302
|
+
chunks.push(buf);
|
|
303
|
+
}
|
|
304
|
+
const raw = Buffer.concat(chunks).toString("utf8");
|
|
305
|
+
let body;
|
|
306
|
+
try {
|
|
307
|
+
body = raw ? JSON.parse(raw) : undefined;
|
|
308
|
+
}
|
|
309
|
+
catch {
|
|
310
|
+
return sendJson(res, 400, { error: "invalid JSON body" });
|
|
311
|
+
}
|
|
312
|
+
// Gate the expensive tools (deep_research*) at the transport — read tools
|
|
313
|
+
// stay open for discovery. These burn tokens + minutes of compute, so they
|
|
314
|
+
// require a bearer token from DEEP_RESEARCH_KEYS (comma-separated). Fail
|
|
315
|
+
// CLOSED: if no keys are configured, the gated tools are unusable.
|
|
316
|
+
const calls = Array.isArray(body) ? body : [body];
|
|
317
|
+
const wantsGated = calls.some((m) => m?.method === "tools/call" && GATED_TOOLS.has(m?.params?.name));
|
|
318
|
+
if (wantsGated) {
|
|
319
|
+
const allow = (process.env.DEEP_RESEARCH_KEYS ?? "")
|
|
320
|
+
.split(",").map((s) => s.trim()).filter(Boolean);
|
|
321
|
+
const token = (req.headers.authorization ?? "").replace(/^Bearer\s+/i, "").trim();
|
|
322
|
+
if (allow.length === 0 || !token || !allow.includes(token)) {
|
|
323
|
+
return sendJson(res, 401, { error: "deep_research requires an authorized bearer token" });
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
// Stateless: a fresh Server + transport per request. Sidesteps session
|
|
327
|
+
// management entirely (read tools are stateless; deep_research* only enqueue).
|
|
328
|
+
const server = buildServer();
|
|
329
|
+
const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: undefined });
|
|
330
|
+
res.on("close", () => {
|
|
331
|
+
try {
|
|
332
|
+
transport.close();
|
|
333
|
+
}
|
|
334
|
+
catch { /* ignore */ }
|
|
335
|
+
try {
|
|
336
|
+
server.close();
|
|
337
|
+
}
|
|
338
|
+
catch { /* ignore */ }
|
|
339
|
+
});
|
|
340
|
+
await server.connect(transport);
|
|
341
|
+
await transport.handleRequest(req, res, body);
|
|
342
|
+
}
|
|
343
|
+
catch (e) {
|
|
344
|
+
if (!res.headersSent) {
|
|
345
|
+
sendJson(res, 500, { error: e?.message ?? String(e) });
|
|
346
|
+
}
|
|
347
|
+
else {
|
|
348
|
+
try {
|
|
349
|
+
res.end();
|
|
350
|
+
}
|
|
351
|
+
catch { /* ignore */ }
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
});
|
|
355
|
+
await new Promise((resolve) => {
|
|
356
|
+
httpServer.listen(opts.port, opts.host, () => {
|
|
357
|
+
process.stderr.write(`4ort MCP (Streamable HTTP) listening on http://${opts.host}:${opts.port}/mcp — tools: ${TOOLS.map((t) => t.name).join(", ")}\n`);
|
|
358
|
+
resolve();
|
|
359
|
+
});
|
|
360
|
+
});
|
|
361
|
+
// Keep the process alive (the http server holds the event loop).
|
|
362
|
+
}
|
|
363
|
+
//# sourceMappingURL=mcp-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export interface WebReadResult {
|
|
2
|
+
ok: boolean;
|
|
3
|
+
url: string;
|
|
4
|
+
final_url?: string;
|
|
5
|
+
source: "live" | "4ort.xyz";
|
|
6
|
+
status?: number;
|
|
7
|
+
content_type?: string;
|
|
8
|
+
title?: string;
|
|
9
|
+
byline?: string | null;
|
|
10
|
+
word_count?: number;
|
|
11
|
+
excerpt?: string;
|
|
12
|
+
text?: string;
|
|
13
|
+
truncated?: boolean;
|
|
14
|
+
reason?: string;
|
|
15
|
+
size?: number;
|
|
16
|
+
entity?: unknown;
|
|
17
|
+
}
|
|
18
|
+
export declare function webRead(rawUrl: string, opts?: {
|
|
19
|
+
maxChars?: number;
|
|
20
|
+
}): Promise<WebReadResult>;
|