obsidian-native-mcp 1.0.2 → 1.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/.github/workflows/ci.yml +1 -0
- package/.husky/commit-msg +18 -0
- package/CHANGELOG.md +3 -3
- package/README.md +18 -11
- package/dist/cli/index.js +19 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/handlers/prompts.js +3 -30
- package/dist/handlers/prompts.js.map +1 -1
- package/dist/handlers/tools.js +80 -7
- package/dist/handlers/tools.js.map +1 -1
- package/dist/mcp/http-transport.js +21 -3
- package/dist/mcp/http-transport.js.map +1 -1
- package/dist/mcp/protocol.js +32 -11
- package/dist/mcp/protocol.js.map +1 -1
- package/dist/mcp/server.js +170 -2
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/stdio-transport.js +12 -4
- package/dist/mcp/stdio-transport.js.map +1 -1
- package/dist/plugin/main.js +1192 -229
- package/dist/plugin/main.js.map +1 -1
- package/dist/plugin/manifest.json +1 -1
- package/dist/utils/fs-utils.js +639 -172
- package/dist/utils/fs-utils.js.map +1 -1
- package/dist/utils/log.js +34 -0
- package/dist/utils/log.js.map +1 -0
- package/dist/utils/markdown.js +256 -0
- package/dist/utils/markdown.js.map +1 -0
- package/dist/utils/search.js +2 -1
- package/dist/utils/search.js.map +1 -1
- package/dist/utils/vaults.js +14 -0
- package/dist/utils/vaults.js.map +1 -1
- package/manifest.json +1 -1
- package/package.json +2 -1
- package/renovate.json +6 -0
- package/src/cli/index.ts +24 -2
- package/src/handlers/prompts.ts +1 -29
- package/src/handlers/tools.ts +94 -7
- package/src/mcp/http-transport.ts +24 -3
- package/src/mcp/protocol.ts +38 -12
- package/src/mcp/server.ts +172 -2
- package/src/mcp/stdio-transport.ts +16 -5
- package/src/plugin/main.ts +26 -2
- package/src/utils/fs-utils.ts +981 -200
- package/src/utils/log.ts +43 -0
- package/src/utils/markdown.ts +325 -0
- package/src/utils/search.ts +3 -2
- package/src/utils/vaults.ts +23 -0
- package/tests/fs-utils.test.ts +309 -0
- package/tests/http-transport.test.ts +111 -0
- package/tests/protocol.test.ts +36 -0
- package/tests/server-tools.test.ts +98 -0
package/.github/workflows/ci.yml
CHANGED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
#!/usr/bin/env sh
|
|
2
|
+
|
|
3
|
+
message_file="$1"
|
|
4
|
+
subject="$(head -n 1 "$message_file")"
|
|
5
|
+
|
|
6
|
+
if printf '%s' "$subject" | grep -Eq '^(Merge|Revert )'; then
|
|
7
|
+
exit 0
|
|
8
|
+
fi
|
|
9
|
+
|
|
10
|
+
if printf '%s' "$subject" | grep -Eq '^(feat|fix|docs|style|refactor|perf|test|build|ci|chore|revert)(\([a-z0-9._/-]+\))?(!)?: .+'; then
|
|
11
|
+
exit 0
|
|
12
|
+
fi
|
|
13
|
+
|
|
14
|
+
echo "Invalid commit message format."
|
|
15
|
+
echo "Expected Conventional Commits, for example:"
|
|
16
|
+
echo " feat: add MCP file management tools"
|
|
17
|
+
echo " fix(cli): handle missing vault config"
|
|
18
|
+
exit 1
|
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
# [1.1.0](https://github.com/usrivastava92/obsidian-native-mcp/compare/v1.0.3...v1.1.0) (2026-05-20)
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
###
|
|
4
|
+
### Features
|
|
5
5
|
|
|
6
|
-
* add
|
|
6
|
+
* add expanded MCP file management tools ([#11](https://github.com/usrivastava92/obsidian-native-mcp/issues/11)) ([b0ded35](https://github.com/usrivastava92/obsidian-native-mcp/commit/b0ded35492b10000998b283c1bbd1827edd28ef3))
|
package/README.md
CHANGED
|
@@ -122,17 +122,24 @@ After enabling the plugin, open its settings tab. You'll see a URL like `http://
|
|
|
122
122
|
|
|
123
123
|
## Tools
|
|
124
124
|
|
|
125
|
-
| Tool
|
|
126
|
-
|
|
|
127
|
-
| `list_vaults`
|
|
128
|
-
| `get_vault_info`
|
|
129
|
-
| `list_files`
|
|
130
|
-
| `
|
|
131
|
-
| `
|
|
132
|
-
| `
|
|
133
|
-
| `
|
|
134
|
-
| `
|
|
135
|
-
| `
|
|
125
|
+
| Tool | Description |
|
|
126
|
+
| ----------------- | ------------------------------------------------------------------- |
|
|
127
|
+
| `list_vaults` | List all configured vaults with paths |
|
|
128
|
+
| `get_vault_info` | Stats per vault (file count, etc.) |
|
|
129
|
+
| `list_files` | List files/dirs in a vault directory, optionally recursively |
|
|
130
|
+
| `search_files` | Find files by exact name, substring, glob, or regex |
|
|
131
|
+
| `get_file` | Read file content (markdown or json with frontmatter) |
|
|
132
|
+
| `read_metadata` | Read frontmatter, headings, tags, aliases, and file metadata |
|
|
133
|
+
| `create_file` | Create or overwrite a file |
|
|
134
|
+
| `replace_file` | Replace full file content with explicit create-if-missing semantics |
|
|
135
|
+
| `append_to_file` | Append content to a file |
|
|
136
|
+
| `patch_file` | Patch or delete content by heading, block reference, or frontmatter |
|
|
137
|
+
| `replace_section` | Replace a heading section body |
|
|
138
|
+
| `move_file` | Move or rename a file and optionally update resolvable references |
|
|
139
|
+
| `delete_file` | Delete a file or move it into the vault-local `.trash` directory |
|
|
140
|
+
| `get_links` | Read backlinks, outlinks, or both |
|
|
141
|
+
| `bulk_patch` | Apply a batch of patch operations, optionally atomically |
|
|
142
|
+
| `search` | Full-text search across markdown files |
|
|
136
143
|
|
|
137
144
|
All file tools accept an optional `vault` parameter. When only one vault is configured, it's inferred automatically.
|
|
138
145
|
|
package/dist/cli/index.js
CHANGED
|
@@ -3,21 +3,38 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
4
|
const server_1 = require("../mcp/server");
|
|
5
5
|
const stdio_transport_1 = require("../mcp/stdio-transport");
|
|
6
|
+
const log_1 = require("../utils/log");
|
|
6
7
|
const vaults_1 = require("../utils/vaults");
|
|
8
|
+
const log = (0, log_1.createLogger)("cli");
|
|
7
9
|
async function main() {
|
|
8
10
|
const registry = new vaults_1.VaultRegistry();
|
|
9
11
|
if (process.argv.includes("--version") || process.argv.includes("-v")) {
|
|
10
12
|
console.log("0.2.0");
|
|
11
13
|
process.exit(0);
|
|
12
14
|
}
|
|
13
|
-
|
|
15
|
+
const vaults = registry.list();
|
|
16
|
+
const validation = registry.validate();
|
|
17
|
+
log.info("starting obsidian-native-mcp", {
|
|
18
|
+
transport: "stdio",
|
|
19
|
+
vaultCount: vaults.length,
|
|
20
|
+
source: registry.getSource(),
|
|
21
|
+
});
|
|
22
|
+
if (vaults.length === 0) {
|
|
23
|
+
log.warn("no vaults configured", {
|
|
24
|
+
hint: "Set OBSIDIAN_VAULT_PATHS or ~/.config/obsidian-native-mcp/vaults.json",
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
for (const vault of validation.missing) {
|
|
28
|
+
log.warn("configured vault path does not exist", { vault: vault.name, path: vault.path });
|
|
29
|
+
}
|
|
14
30
|
const server = (0, server_1.createServer)(registry);
|
|
15
31
|
const transport = new stdio_transport_1.StdioTransport();
|
|
16
32
|
transport.onRequest(async (msg) => server.handleRequest(msg));
|
|
17
33
|
transport.start();
|
|
34
|
+
log.info("stdio transport ready", { protocol: "jsonl" });
|
|
18
35
|
}
|
|
19
36
|
main().catch((err) => {
|
|
20
|
-
|
|
37
|
+
log.error("startup failed", { error: (0, log_1.formatError)(err) });
|
|
21
38
|
process.exit(1);
|
|
22
39
|
});
|
|
23
40
|
//# sourceMappingURL=index.js.map
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;;AACA,0CAA6C;AAC7C,4DAAwD;AACxD,4CAAgD;AAEhD,KAAK,UAAU,IAAI;IACjB,MAAM,QAAQ,GAAG,IAAI,sBAAa,EAAE,CAAC;IAErC,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACtE,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;;AACA,0CAA6C;AAC7C,4DAAwD;AACxD,sCAAyD;AACzD,4CAAgD;AAEhD,MAAM,GAAG,GAAG,IAAA,kBAAY,EAAC,KAAK,CAAC,CAAC;AAEhC,KAAK,UAAU,IAAI;IACjB,MAAM,QAAQ,GAAG,IAAI,sBAAa,EAAE,CAAC;IAErC,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACtE,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC/B,MAAM,UAAU,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAC;IAEvC,GAAG,CAAC,IAAI,CAAC,8BAA8B,EAAE;QACvC,SAAS,EAAE,OAAO;QAClB,UAAU,EAAE,MAAM,CAAC,MAAM;QACzB,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE;KAC7B,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,GAAG,CAAC,IAAI,CAAC,sBAAsB,EAAE;YAC/B,IAAI,EAAE,uEAAuE;SAC9E,CAAC,CAAC;IACL,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;QACvC,GAAG,CAAC,IAAI,CAAC,sCAAsC,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5F,CAAC;IAED,MAAM,MAAM,GAAG,IAAA,qBAAY,EAAC,QAAQ,CAAC,CAAC;IACtC,MAAM,SAAS,GAAG,IAAI,gCAAc,EAAE,CAAC;IAEvC,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9D,SAAS,CAAC,KAAK,EAAE,CAAC;IAElB,GAAG,CAAC,IAAI,CAAC,uBAAuB,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;AAC3D,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,GAAG,CAAC,KAAK,CAAC,gBAAgB,EAAE,EAAE,KAAK,EAAE,IAAA,iBAAW,EAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/handlers/prompts.js
CHANGED
|
@@ -4,34 +4,7 @@ exports.PromptHandler = void 0;
|
|
|
4
4
|
const fs_1 = require("fs");
|
|
5
5
|
const promises_1 = require("fs/promises");
|
|
6
6
|
const path_1 = require("path");
|
|
7
|
-
|
|
8
|
-
if (!content.startsWith("---"))
|
|
9
|
-
return null;
|
|
10
|
-
const endIndex = content.indexOf("---", 3);
|
|
11
|
-
if (endIndex === -1)
|
|
12
|
-
return null;
|
|
13
|
-
const raw = content.slice(3, endIndex).trim();
|
|
14
|
-
const body = content.slice(endIndex + 3).trim();
|
|
15
|
-
const frontmatter = {};
|
|
16
|
-
for (const line of raw.split("\n")) {
|
|
17
|
-
const colonIndex = line.indexOf(":");
|
|
18
|
-
if (colonIndex === -1)
|
|
19
|
-
continue;
|
|
20
|
-
const key = line.slice(0, colonIndex).trim();
|
|
21
|
-
let value = line.slice(colonIndex + 1).trim();
|
|
22
|
-
if (value.startsWith('"') && value.endsWith('"'))
|
|
23
|
-
value = value.slice(1, -1);
|
|
24
|
-
else if (value.startsWith("[") && value.endsWith("]")) {
|
|
25
|
-
value = value
|
|
26
|
-
.slice(1, -1)
|
|
27
|
-
.split(",")
|
|
28
|
-
.map((s) => s.trim().replace(/^["']|["']$/g, ""))
|
|
29
|
-
.filter(Boolean);
|
|
30
|
-
}
|
|
31
|
-
frontmatter[key] = value;
|
|
32
|
-
}
|
|
33
|
-
return { frontmatter, body };
|
|
34
|
-
}
|
|
7
|
+
const markdown_1 = require("../utils/markdown");
|
|
35
8
|
class PromptHandler {
|
|
36
9
|
registry;
|
|
37
10
|
promptDir = "Prompts";
|
|
@@ -58,7 +31,7 @@ class PromptHandler {
|
|
|
58
31
|
continue;
|
|
59
32
|
try {
|
|
60
33
|
const content = await (0, promises_1.readFile)(fullPath, "utf-8");
|
|
61
|
-
const parsed = parseFrontmatter(content);
|
|
34
|
+
const parsed = (0, markdown_1.parseFrontmatter)(content);
|
|
62
35
|
const tags = parsed?.frontmatter?.tags || [];
|
|
63
36
|
if (!tags.includes("mcp-tools-prompt"))
|
|
64
37
|
continue;
|
|
@@ -85,7 +58,7 @@ class PromptHandler {
|
|
|
85
58
|
catch {
|
|
86
59
|
throw new Error(`Prompt not found: ${name}`);
|
|
87
60
|
}
|
|
88
|
-
const parsed = parseFrontmatter(content);
|
|
61
|
+
const parsed = (0, markdown_1.parseFrontmatter)(content);
|
|
89
62
|
const body = parsed?.body || content;
|
|
90
63
|
const withoutFrontmatter = body.trim();
|
|
91
64
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/handlers/prompts.ts"],"names":[],"mappings":";;;AAAA,2BAA2C;AAC3C,0CAAuC;AACvC,+BAA4B;
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/handlers/prompts.ts"],"names":[],"mappings":"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"}
|
package/dist/handlers/tools.js
CHANGED
|
@@ -18,6 +18,13 @@ class VaultFileHandler {
|
|
|
18
18
|
append_to_file: this.handleAppendFile.bind(this),
|
|
19
19
|
patch_file: this.handlePatchFile.bind(this),
|
|
20
20
|
delete_file: this.handleDeleteFile.bind(this),
|
|
21
|
+
move_file: this.handleMoveFile.bind(this),
|
|
22
|
+
replace_file: this.handleReplaceFile.bind(this),
|
|
23
|
+
replace_section: this.handleReplaceSection.bind(this),
|
|
24
|
+
search_files: this.handleSearchFiles.bind(this),
|
|
25
|
+
read_metadata: this.handleReadMetadata.bind(this),
|
|
26
|
+
get_links: this.handleGetLinks.bind(this),
|
|
27
|
+
bulk_patch: this.handleBulkPatch.bind(this),
|
|
21
28
|
search: this.handleSearch.bind(this),
|
|
22
29
|
};
|
|
23
30
|
}
|
|
@@ -42,7 +49,7 @@ class VaultFileHandler {
|
|
|
42
49
|
}
|
|
43
50
|
async handleListFiles(args) {
|
|
44
51
|
const vaultPath = this.resolveVault(args);
|
|
45
|
-
const entries = (0, fs_utils_1.listFiles)(vaultPath, args.directory);
|
|
52
|
+
const entries = (0, fs_utils_1.listFiles)(vaultPath, args.directory, args.recursive);
|
|
46
53
|
return {
|
|
47
54
|
content: [{ type: "text", text: JSON.stringify(entries, null, 2) }],
|
|
48
55
|
};
|
|
@@ -86,19 +93,85 @@ class VaultFileHandler {
|
|
|
86
93
|
contentType: args.contentType,
|
|
87
94
|
targetDelimiter: args.targetDelimiter,
|
|
88
95
|
trimTargetWhitespace: args.trimTargetWhitespace,
|
|
96
|
+
dryRun: args.dry_run,
|
|
89
97
|
});
|
|
90
98
|
return {
|
|
91
|
-
content: [
|
|
92
|
-
{ type: "text", text: "File patched successfully" },
|
|
93
|
-
{ type: "text", text: result },
|
|
94
|
-
],
|
|
99
|
+
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
|
|
95
100
|
};
|
|
96
101
|
}
|
|
97
102
|
async handleDeleteFile(args) {
|
|
98
103
|
const vaultPath = this.resolveVault(args);
|
|
99
|
-
(0, fs_utils_1.deleteFileHandler)(vaultPath, args.filename
|
|
104
|
+
const result = await (0, fs_utils_1.deleteFileHandler)(vaultPath, args.filename, {
|
|
105
|
+
trash: args.trash,
|
|
106
|
+
dryRun: args.dry_run,
|
|
107
|
+
});
|
|
108
|
+
return {
|
|
109
|
+
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
async handleMoveFile(args) {
|
|
113
|
+
const vaultPath = this.resolveVault(args);
|
|
114
|
+
const result = await (0, fs_utils_1.moveFile)(vaultPath, args.from, args.to, {
|
|
115
|
+
updateLinks: args.update_links,
|
|
116
|
+
dryRun: args.dry_run,
|
|
117
|
+
});
|
|
118
|
+
return {
|
|
119
|
+
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
async handleReplaceFile(args) {
|
|
123
|
+
const vaultPath = this.resolveVault(args);
|
|
124
|
+
const result = await (0, fs_utils_1.replaceFile)(vaultPath, args.filename, args.content, {
|
|
125
|
+
createIfMissing: args.create_if_missing,
|
|
126
|
+
dryRun: args.dry_run,
|
|
127
|
+
});
|
|
128
|
+
return {
|
|
129
|
+
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
async handleReplaceSection(args) {
|
|
133
|
+
const vaultPath = this.resolveVault(args);
|
|
134
|
+
const result = await (0, fs_utils_1.replaceSection)(vaultPath, args.filename, args.heading, args.content, {
|
|
135
|
+
createIfMissing: args.create_if_missing,
|
|
136
|
+
dryRun: args.dry_run,
|
|
137
|
+
targetDelimiter: args.targetDelimiter,
|
|
138
|
+
});
|
|
139
|
+
return {
|
|
140
|
+
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
async handleSearchFiles(args) {
|
|
144
|
+
const vaultPath = this.resolveVault(args);
|
|
145
|
+
const result = await (0, fs_utils_1.searchFiles)(vaultPath, args.query, {
|
|
146
|
+
directory: args.directory,
|
|
147
|
+
mode: args.mode,
|
|
148
|
+
});
|
|
149
|
+
return {
|
|
150
|
+
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
async handleReadMetadata(args) {
|
|
154
|
+
const vaultPath = this.resolveVault(args);
|
|
155
|
+
const result = await (0, fs_utils_1.readMetadata)(vaultPath, args.filename);
|
|
156
|
+
return {
|
|
157
|
+
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
async handleGetLinks(args) {
|
|
161
|
+
const vaultPath = this.resolveVault(args);
|
|
162
|
+
const result = await (0, fs_utils_1.getLinks)(vaultPath, args.filename, args.direction || "both");
|
|
163
|
+
return {
|
|
164
|
+
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
async handleBulkPatch(args) {
|
|
168
|
+
const vaultPath = this.resolveVault(args);
|
|
169
|
+
const result = await (0, fs_utils_1.bulkPatch)(vaultPath, args.operations || [], {
|
|
170
|
+
atomic: args.atomic,
|
|
171
|
+
dryRun: args.dry_run,
|
|
172
|
+
});
|
|
100
173
|
return {
|
|
101
|
-
content: [{ type: "text", text:
|
|
174
|
+
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
|
|
102
175
|
};
|
|
103
176
|
}
|
|
104
177
|
async handleSearch(args) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/handlers/tools.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/handlers/tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.HttpTransport = void 0;
|
|
7
7
|
const http_1 = __importDefault(require("http"));
|
|
8
|
+
const log_1 = require("../utils/log");
|
|
9
|
+
const log = (0, log_1.createLogger)("http");
|
|
8
10
|
class HttpTransport {
|
|
9
11
|
requestHandler = null;
|
|
10
12
|
server = null;
|
|
@@ -23,16 +25,20 @@ class HttpTransport {
|
|
|
23
25
|
// Messages sent back via SSE response, not directly
|
|
24
26
|
}
|
|
25
27
|
start() {
|
|
26
|
-
return new Promise((resolve) => {
|
|
28
|
+
return new Promise((resolve, reject) => {
|
|
27
29
|
this.server = http_1.default.createServer((req, res) => {
|
|
28
30
|
this.handleRequest(req, res);
|
|
29
31
|
});
|
|
32
|
+
this.server.on("error", (err) => {
|
|
33
|
+
log.error("http transport failed", { error: (0, log_1.formatError)(err) });
|
|
34
|
+
reject(err);
|
|
35
|
+
});
|
|
30
36
|
this.server.listen(0, "127.0.0.1", () => {
|
|
31
37
|
const addr = this.server.address();
|
|
32
38
|
if (addr && typeof addr === "object") {
|
|
33
39
|
this.port = addr.port;
|
|
34
40
|
}
|
|
35
|
-
|
|
41
|
+
log.info("http transport ready", { url: this.url });
|
|
36
42
|
resolve();
|
|
37
43
|
});
|
|
38
44
|
});
|
|
@@ -62,6 +68,10 @@ class HttpTransport {
|
|
|
62
68
|
this.handleMessage(req, res);
|
|
63
69
|
}
|
|
64
70
|
else {
|
|
71
|
+
log.warn("received request for unknown route", {
|
|
72
|
+
method: req.method || "UNKNOWN",
|
|
73
|
+
path: url.pathname,
|
|
74
|
+
});
|
|
65
75
|
res.writeHead(404);
|
|
66
76
|
res.end("Not found");
|
|
67
77
|
}
|
|
@@ -75,15 +85,18 @@ class HttpTransport {
|
|
|
75
85
|
});
|
|
76
86
|
const messageUrl = `/message?session_id=${sessionId}`;
|
|
77
87
|
res.write(`event: endpoint\ndata: ${messageUrl}\n\n`);
|
|
88
|
+
log.info("sse session opened", { sessionId });
|
|
78
89
|
this.sessions.set(sessionId, res);
|
|
79
90
|
req.on("close", () => {
|
|
80
91
|
this.sessions.delete(sessionId);
|
|
92
|
+
log.info("sse session closed", { sessionId });
|
|
81
93
|
});
|
|
82
94
|
}
|
|
83
95
|
handleMessage(req, res) {
|
|
84
96
|
const url = new URL(req.url || "/", `http://${req.headers.host || "localhost"}`);
|
|
85
97
|
const sessionId = url.searchParams.get("session_id");
|
|
86
98
|
if (!sessionId || !this.sessions.has(sessionId)) {
|
|
99
|
+
log.warn("rejected message for unknown session", { sessionId: sessionId || null });
|
|
87
100
|
res.writeHead(400);
|
|
88
101
|
res.end("Invalid or missing session_id");
|
|
89
102
|
return;
|
|
@@ -96,6 +109,7 @@ class HttpTransport {
|
|
|
96
109
|
try {
|
|
97
110
|
const msg = JSON.parse(body);
|
|
98
111
|
if (msg.jsonrpc !== "2.0" || !("method" in msg) || !("id" in msg)) {
|
|
112
|
+
log.warn("rejected invalid json-rpc payload", { sessionId });
|
|
99
113
|
res.writeHead(400);
|
|
100
114
|
res.end("Invalid JSON-RPC message");
|
|
101
115
|
return;
|
|
@@ -110,7 +124,11 @@ class HttpTransport {
|
|
|
110
124
|
res.writeHead(202);
|
|
111
125
|
res.end();
|
|
112
126
|
}
|
|
113
|
-
catch {
|
|
127
|
+
catch (err) {
|
|
128
|
+
log.error("failed to handle http message", {
|
|
129
|
+
sessionId,
|
|
130
|
+
error: (0, log_1.formatError)(err),
|
|
131
|
+
});
|
|
114
132
|
res.writeHead(400);
|
|
115
133
|
res.end("Invalid JSON");
|
|
116
134
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-transport.js","sourceRoot":"","sources":["../../src/mcp/http-transport.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAwB;
|
|
1
|
+
{"version":3,"file":"http-transport.js","sourceRoot":"","sources":["../../src/mcp/http-transport.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp/protocol.js
CHANGED
|
@@ -5,7 +5,8 @@ exports.sendMessage = sendMessage;
|
|
|
5
5
|
exports.parseMessages = parseMessages;
|
|
6
6
|
function encodeMessage(message) {
|
|
7
7
|
const json = JSON.stringify(message);
|
|
8
|
-
const
|
|
8
|
+
const bodyLength = Buffer.byteLength(json, "utf8");
|
|
9
|
+
const header = `Content-Length: ${bodyLength}\r\n\r\n`;
|
|
9
10
|
const encoder = new TextEncoder();
|
|
10
11
|
const headerBytes = encoder.encode(header);
|
|
11
12
|
const bodyBytes = encoder.encode(json);
|
|
@@ -19,20 +20,40 @@ function sendMessage(message) {
|
|
|
19
20
|
}
|
|
20
21
|
function parseMessages(buffer) {
|
|
21
22
|
const messages = [];
|
|
22
|
-
let
|
|
23
|
+
let offset = 0;
|
|
23
24
|
while (true) {
|
|
24
|
-
const
|
|
25
|
-
if (
|
|
25
|
+
const headerEnd = buffer.indexOf("\r\n\r\n", offset, "utf8");
|
|
26
|
+
if (headerEnd === -1)
|
|
26
27
|
break;
|
|
27
|
-
const
|
|
28
|
-
const
|
|
29
|
-
const
|
|
30
|
-
if (
|
|
28
|
+
const headerText = buffer.slice(offset, headerEnd).toString("utf8");
|
|
29
|
+
const headers = headerText.split("\r\n");
|
|
30
|
+
const contentLengthHeader = headers.find((header) => header.toLowerCase().startsWith("content-length:"));
|
|
31
|
+
if (!contentLengthHeader)
|
|
31
32
|
break;
|
|
32
|
-
const
|
|
33
|
-
|
|
33
|
+
const contentLength = parseInt(contentLengthHeader.slice("Content-Length:".length).trim(), 10);
|
|
34
|
+
if (Number.isNaN(contentLength))
|
|
35
|
+
break;
|
|
36
|
+
const bodyStart = headerEnd + 4;
|
|
37
|
+
const bodyEnd = bodyStart + contentLength;
|
|
38
|
+
if (buffer.length < bodyEnd)
|
|
39
|
+
break;
|
|
40
|
+
const jsonStr = buffer.slice(bodyStart, bodyEnd).toString("utf8");
|
|
41
|
+
offset = bodyEnd;
|
|
34
42
|
messages.push(jsonStr);
|
|
35
43
|
}
|
|
36
|
-
|
|
44
|
+
if (messages.length > 0) {
|
|
45
|
+
return { messages, remaining: buffer.subarray(offset) };
|
|
46
|
+
}
|
|
47
|
+
while (true) {
|
|
48
|
+
const newlineIndex = buffer.indexOf("\n", offset, "utf8");
|
|
49
|
+
if (newlineIndex === -1)
|
|
50
|
+
break;
|
|
51
|
+
const line = buffer.slice(offset, newlineIndex).toString("utf8").trim();
|
|
52
|
+
offset = newlineIndex + 1;
|
|
53
|
+
if (!line)
|
|
54
|
+
continue;
|
|
55
|
+
messages.push(line);
|
|
56
|
+
}
|
|
57
|
+
return { messages, remaining: buffer.subarray(offset) };
|
|
37
58
|
}
|
|
38
59
|
//# sourceMappingURL=protocol.js.map
|
package/dist/mcp/protocol.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/mcp/protocol.ts"],"names":[],"mappings":";;AAmCA,
|
|
1
|
+
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/mcp/protocol.ts"],"names":[],"mappings":"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"}
|