nusus-mcp 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 +9 -0
- package/README.md +48 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +171 -0
- package/dist/index.js.map +1 -0
- package/package.json +51 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Nusus contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
6
|
+
|
|
7
|
+
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
8
|
+
|
|
9
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# nusus-mcp
|
|
2
|
+
|
|
3
|
+
Local [Model Context Protocol](https://modelcontextprotocol.io/) stdio server for searching and citing classical Islamic and Arabic texts through Nusus and Turath.
|
|
4
|
+
|
|
5
|
+
## Claude Desktop
|
|
6
|
+
|
|
7
|
+
Node.js 20+ is required. Add this to `claude_desktop_config.json`, then restart Claude Desktop:
|
|
8
|
+
|
|
9
|
+
```json
|
|
10
|
+
{
|
|
11
|
+
"mcpServers": {
|
|
12
|
+
"nusus": {
|
|
13
|
+
"command": "npx",
|
|
14
|
+
"args": ["-y", "nusus-mcp"]
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
`npx` downloads the npm package automatically; users do not need to clone this repository. Claude Desktop may start with a limited `PATH`. If it cannot find `npx`, replace `"npx"` with the absolute path printed by `which npx` (macOS/Linux) or `where.exe npx` (Windows).
|
|
21
|
+
|
|
22
|
+
The server uses stdio only and writes protocol messages to stdout. It calls Turath's public API for live tools; `find_books` and `find_authors` use Nusus's bundled offline catalog.
|
|
23
|
+
|
|
24
|
+
## Tools
|
|
25
|
+
|
|
26
|
+
| Tool | Purpose and arguments |
|
|
27
|
+
| --- | --- |
|
|
28
|
+
| `find_books` | Find books offline. Required `query` (may be empty with a filter); optional `authorId`, `categoryId`, `limit`. |
|
|
29
|
+
| `find_authors` | Find authors offline. Required `query`; optional `limit`. |
|
|
30
|
+
| `retrieve` | Retrieve bounded, citable passages. Required `query`; optional `bookId`, `authorId`, `categoryId`, `maxPassages`, `maxCharsPerPassage`, `pagesBefore`, `pagesAfter`. |
|
|
31
|
+
| `get_context` | Get an internal Turath page with adjacent context. Required `bookId`, `pageId`; optional `pagesBefore`, `pagesAfter`. |
|
|
32
|
+
| `get_book` | Get book metadata and table of contents. Required `bookId`. |
|
|
33
|
+
|
|
34
|
+
Each live search filter accepts at most one ID. `pageId` is Turath's internal page ID, not the printed page.
|
|
35
|
+
|
|
36
|
+
## Development
|
|
37
|
+
|
|
38
|
+
`nusus-mcp` declares the publishable dependency `"nusus": "^0.6.0"`. Because the SDK package is the workspace root rather than a child workspace, Bun resolves that dependency from npm instead of linking the local root. Until `nusus@0.6.0` is published, keep the existing install for local verification; after publishing it, run:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
bun install
|
|
42
|
+
bun run build
|
|
43
|
+
(cd mcp && bun run build && bun run typecheck && bun run test)
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
Publish `nusus@0.6.0` before publishing `nusus-mcp@0.1.0` so fresh installs can resolve the SDK dependency.
|
|
47
|
+
|
|
48
|
+
`NUSUS_TURATH_BASE_URL` overrides the Turath API base URL, primarily for fixture-backed tests.
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,171 @@
|
|
|
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 { NususError } from "nusus";
|
|
6
|
+
import { createTurathClient } from "nusus/turath";
|
|
7
|
+
const positiveInteger = (args, key, required = false) => {
|
|
8
|
+
const value = args[key];
|
|
9
|
+
if (value === undefined && !required)
|
|
10
|
+
return undefined;
|
|
11
|
+
if (!Number.isInteger(value) || value < 1)
|
|
12
|
+
throw new NususError("INVALID_ARGUMENT", `${key} must be a positive integer`);
|
|
13
|
+
return value;
|
|
14
|
+
};
|
|
15
|
+
const nonNegativeInteger = (args, key) => {
|
|
16
|
+
const value = args[key];
|
|
17
|
+
if (value === undefined)
|
|
18
|
+
return undefined;
|
|
19
|
+
if (!Number.isInteger(value) || value < 0)
|
|
20
|
+
throw new NususError("INVALID_ARGUMENT", `${key} must be a non-negative integer`);
|
|
21
|
+
return value;
|
|
22
|
+
};
|
|
23
|
+
const stringArgument = (args, key) => {
|
|
24
|
+
const value = args[key];
|
|
25
|
+
if (typeof value !== "string")
|
|
26
|
+
throw new NususError("INVALID_ARGUMENT", `${key} must be a string`);
|
|
27
|
+
return value;
|
|
28
|
+
};
|
|
29
|
+
const optional = (values) => Object.fromEntries(Object.entries(values).filter(([, value]) => value !== undefined));
|
|
30
|
+
const baseUrl = process.env.NUSUS_TURATH_BASE_URL;
|
|
31
|
+
const turath = createTurathClient(baseUrl ? { baseUrl } : {});
|
|
32
|
+
const tools = [
|
|
33
|
+
{
|
|
34
|
+
name: "find_books",
|
|
35
|
+
description: "Find books in Nusus's bundled offline Turath catalog by Arabic title and optional single author/category filters.",
|
|
36
|
+
inputSchema: {
|
|
37
|
+
type: "object",
|
|
38
|
+
properties: {
|
|
39
|
+
query: { type: "string", description: "Title query; may be empty when authorId or categoryId is provided." },
|
|
40
|
+
authorId: { type: "integer", minimum: 1 },
|
|
41
|
+
categoryId: { type: "integer", minimum: 1 },
|
|
42
|
+
limit: { type: "integer", minimum: 1 },
|
|
43
|
+
},
|
|
44
|
+
required: ["query"],
|
|
45
|
+
additionalProperties: false,
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
name: "find_authors",
|
|
50
|
+
description: "Find authors by Arabic name in Nusus's bundled offline Turath catalog.",
|
|
51
|
+
inputSchema: {
|
|
52
|
+
type: "object",
|
|
53
|
+
properties: {
|
|
54
|
+
query: { type: "string", minLength: 1 },
|
|
55
|
+
limit: { type: "integer", minimum: 1 },
|
|
56
|
+
},
|
|
57
|
+
required: ["query"],
|
|
58
|
+
additionalProperties: false,
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
name: "retrieve",
|
|
63
|
+
description: "Retrieve bounded, citable Turath passages. Each filter accepts at most one ID because that is the verified upstream limit.",
|
|
64
|
+
inputSchema: {
|
|
65
|
+
type: "object",
|
|
66
|
+
properties: {
|
|
67
|
+
query: { type: "string", minLength: 1 },
|
|
68
|
+
bookId: { type: "integer", minimum: 1 },
|
|
69
|
+
authorId: { type: "integer", minimum: 1 },
|
|
70
|
+
categoryId: { type: "integer", minimum: 1 },
|
|
71
|
+
maxPassages: { type: "integer", minimum: 1 },
|
|
72
|
+
maxCharsPerPassage: { type: "integer", minimum: 1 },
|
|
73
|
+
pagesBefore: { type: "integer", minimum: 0 },
|
|
74
|
+
pagesAfter: { type: "integer", minimum: 0 },
|
|
75
|
+
},
|
|
76
|
+
required: ["query"],
|
|
77
|
+
additionalProperties: false,
|
|
78
|
+
},
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
name: "get_context",
|
|
82
|
+
description: "Get one Turath page with optional adjacent pages. pageId is Turath's internal page ID, not the printed page.",
|
|
83
|
+
inputSchema: {
|
|
84
|
+
type: "object",
|
|
85
|
+
properties: {
|
|
86
|
+
bookId: { type: "integer", minimum: 1 },
|
|
87
|
+
pageId: { type: "integer", minimum: 1 },
|
|
88
|
+
pagesBefore: { type: "integer", minimum: 0 },
|
|
89
|
+
pagesAfter: { type: "integer", minimum: 0 },
|
|
90
|
+
},
|
|
91
|
+
required: ["bookId", "pageId"],
|
|
92
|
+
additionalProperties: false,
|
|
93
|
+
},
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
name: "get_book",
|
|
97
|
+
description: "Get Turath book metadata and table of contents by book ID.",
|
|
98
|
+
inputSchema: {
|
|
99
|
+
type: "object",
|
|
100
|
+
properties: { bookId: { type: "integer", minimum: 1 } },
|
|
101
|
+
required: ["bookId"],
|
|
102
|
+
additionalProperties: false,
|
|
103
|
+
},
|
|
104
|
+
},
|
|
105
|
+
];
|
|
106
|
+
const jsonContent = (value, isError = false) => ({
|
|
107
|
+
content: [{ type: "text", text: JSON.stringify(value) }],
|
|
108
|
+
...(isError && { isError: true }),
|
|
109
|
+
});
|
|
110
|
+
const runTool = async (name, args) => {
|
|
111
|
+
switch (name) {
|
|
112
|
+
case "find_books": {
|
|
113
|
+
const authorId = positiveInteger(args, "authorId");
|
|
114
|
+
const categoryId = positiveInteger(args, "categoryId");
|
|
115
|
+
return turath.findBooks(stringArgument(args, "query"), optional({
|
|
116
|
+
authorIds: authorId === undefined ? undefined : [authorId],
|
|
117
|
+
categoryIds: categoryId === undefined ? undefined : [categoryId],
|
|
118
|
+
limit: positiveInteger(args, "limit"),
|
|
119
|
+
}));
|
|
120
|
+
}
|
|
121
|
+
case "find_authors":
|
|
122
|
+
return turath.findAuthors(stringArgument(args, "query"), optional({ limit: positiveInteger(args, "limit") }));
|
|
123
|
+
case "retrieve": {
|
|
124
|
+
const bookId = positiveInteger(args, "bookId");
|
|
125
|
+
const authorId = positiveInteger(args, "authorId");
|
|
126
|
+
const categoryId = positiveInteger(args, "categoryId");
|
|
127
|
+
const scope = optional({
|
|
128
|
+
bookIds: bookId === undefined ? undefined : [bookId],
|
|
129
|
+
authorIds: authorId === undefined ? undefined : [authorId],
|
|
130
|
+
categoryIds: categoryId === undefined ? undefined : [categoryId],
|
|
131
|
+
});
|
|
132
|
+
return turath.retrieve(stringArgument(args, "query"), optional({
|
|
133
|
+
scope: Object.keys(scope).length ? scope : undefined,
|
|
134
|
+
maxPassages: positiveInteger(args, "maxPassages"),
|
|
135
|
+
maxCharsPerPassage: positiveInteger(args, "maxCharsPerPassage"),
|
|
136
|
+
pagesBefore: nonNegativeInteger(args, "pagesBefore"),
|
|
137
|
+
pagesAfter: nonNegativeInteger(args, "pagesAfter"),
|
|
138
|
+
}));
|
|
139
|
+
}
|
|
140
|
+
case "get_context":
|
|
141
|
+
return turath.getContextByPage(positiveInteger(args, "bookId", true), positiveInteger(args, "pageId", true), optional({
|
|
142
|
+
pagesBefore: nonNegativeInteger(args, "pagesBefore"),
|
|
143
|
+
pagesAfter: nonNegativeInteger(args, "pagesAfter"),
|
|
144
|
+
}));
|
|
145
|
+
case "get_book":
|
|
146
|
+
return turath.getBook(positiveInteger(args, "bookId", true));
|
|
147
|
+
default:
|
|
148
|
+
throw new NususError("INVALID_ARGUMENT", `Unknown tool: ${name}`);
|
|
149
|
+
}
|
|
150
|
+
};
|
|
151
|
+
const server = new Server({ name: "nusus-mcp", version: "0.1.0" }, { capabilities: { tools: {} } });
|
|
152
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: [...tools] }));
|
|
153
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
154
|
+
try {
|
|
155
|
+
return jsonContent(await runTool(request.params.name, request.params.arguments ?? {}));
|
|
156
|
+
}
|
|
157
|
+
catch (error) {
|
|
158
|
+
if (error instanceof NususError)
|
|
159
|
+
return jsonContent({ code: error.code, message: error.message }, true);
|
|
160
|
+
const message = error instanceof Error ? error.message : "Unknown error";
|
|
161
|
+
return jsonContent({ code: "INTERNAL", message }, true);
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
try {
|
|
165
|
+
await server.connect(new StdioServerTransport());
|
|
166
|
+
}
|
|
167
|
+
catch (error) {
|
|
168
|
+
process.stderr.write(`nusus-mcp failed: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
169
|
+
process.exitCode = 1;
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "nusus-mcp",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Local MCP stdio server for Nusus and Turath",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"turath",
|
|
7
|
+
"shamela",
|
|
8
|
+
"maktaba-shamela",
|
|
9
|
+
"islamic-texts",
|
|
10
|
+
"arabic-books",
|
|
11
|
+
"hadith",
|
|
12
|
+
"fiqh",
|
|
13
|
+
"typescript",
|
|
14
|
+
"sdk",
|
|
15
|
+
"cli",
|
|
16
|
+
"jsonl",
|
|
17
|
+
"mcp",
|
|
18
|
+
"model-context-protocol",
|
|
19
|
+
"agents"
|
|
20
|
+
],
|
|
21
|
+
"repository": {
|
|
22
|
+
"type": "git",
|
|
23
|
+
"url": "git+https://github.com/mwijanarko1/nusus.git",
|
|
24
|
+
"directory": "mcp"
|
|
25
|
+
},
|
|
26
|
+
"homepage": "https://github.com/mwijanarko1/nusus#readme",
|
|
27
|
+
"bugs": "https://github.com/mwijanarko1/nusus/issues",
|
|
28
|
+
"type": "module",
|
|
29
|
+
"bin": {
|
|
30
|
+
"nusus-mcp": "dist/index.js"
|
|
31
|
+
},
|
|
32
|
+
"files": [
|
|
33
|
+
"dist",
|
|
34
|
+
"README.md",
|
|
35
|
+
"LICENSE"
|
|
36
|
+
],
|
|
37
|
+
"scripts": {
|
|
38
|
+
"build": "tsc -p tsconfig.json",
|
|
39
|
+
"prepack": "npm run build",
|
|
40
|
+
"test": "bun run build && bun test tests",
|
|
41
|
+
"typecheck": "tsc -p tsconfig.json --noEmit"
|
|
42
|
+
},
|
|
43
|
+
"dependencies": {
|
|
44
|
+
"@modelcontextprotocol/sdk": "^1.30.0",
|
|
45
|
+
"nusus": "^0.6.0"
|
|
46
|
+
},
|
|
47
|
+
"engines": {
|
|
48
|
+
"node": ">=20"
|
|
49
|
+
},
|
|
50
|
+
"license": "MIT"
|
|
51
|
+
}
|