@naparnik/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.md +19 -0
- package/README.md +74 -0
- package/dist/chunk-T6UWKM37.js +4989 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +36 -0
- package/dist/index.d.ts +118 -0
- package/dist/index.js +1 -0
- package/package.json +58 -0
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { NaparnikConfigError, loadConfig, NaparnikApiClient, McpServer, createNaparnikTools, StdioServerTransport } from './chunk-T6UWKM37.js';
|
|
3
|
+
|
|
4
|
+
// src/cli.ts
|
|
5
|
+
function log(message) {
|
|
6
|
+
process.stderr.write(`[naparnik-mcp] ${message}
|
|
7
|
+
`);
|
|
8
|
+
}
|
|
9
|
+
async function main() {
|
|
10
|
+
const config = loadConfig();
|
|
11
|
+
const client = new NaparnikApiClient(config);
|
|
12
|
+
const server = new McpServer();
|
|
13
|
+
const tools = createNaparnikTools(client);
|
|
14
|
+
for (const tool of tools) server.addTool(tool);
|
|
15
|
+
const transport = new StdioServerTransport();
|
|
16
|
+
transport.onClose((error) => {
|
|
17
|
+
if (error !== void 0) log(`\u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u0435 \u0437\u0430\u043A\u0440\u044B\u0442\u043E \u0441 \u043E\u0448\u0438\u0431\u043A\u043E\u0439: ${error.message}`);
|
|
18
|
+
process.exit(error !== void 0 ? 1 : 0);
|
|
19
|
+
});
|
|
20
|
+
await transport.connect();
|
|
21
|
+
await server.start(transport);
|
|
22
|
+
log(`\u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0451\u043D \u043A ${config.baseUrl}, \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u043E\u0432: ${tools.length}`);
|
|
23
|
+
for (const signal of ["SIGINT", "SIGTERM"]) {
|
|
24
|
+
process.on(signal, () => {
|
|
25
|
+
void server.stop().finally(() => process.exit(0));
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
main().catch((err) => {
|
|
30
|
+
if (err instanceof NaparnikConfigError) {
|
|
31
|
+
log(err.message);
|
|
32
|
+
process.exit(1);
|
|
33
|
+
}
|
|
34
|
+
log(`\u043D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u0437\u0430\u043F\u0443\u0441\u0442\u0438\u0442\u044C\u0441\u044F: ${err instanceof Error ? err.message : String(err)}`);
|
|
35
|
+
process.exit(1);
|
|
36
|
+
});
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { Tool } from '@naparnik/super-agent-core/mcp';
|
|
2
|
+
|
|
3
|
+
interface NaparnikMcpConfig {
|
|
4
|
+
apiKey: string;
|
|
5
|
+
baseUrl: string;
|
|
6
|
+
timeoutMs: number;
|
|
7
|
+
longTimeoutMs: number;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Собирает конфиг из переменных окружения, которые Claude передаёт процессу
|
|
11
|
+
* из блока `env` в своём конфиге.
|
|
12
|
+
*
|
|
13
|
+
* Сообщения об ошибках рассчитаны на человека, который видит их в диагностике
|
|
14
|
+
* Claude и не читал нашу документацию: они говорят, что именно не так и куда
|
|
15
|
+
* идти за ключом.
|
|
16
|
+
*/
|
|
17
|
+
declare function loadConfig(env?: NodeJS.ProcessEnv): NaparnikMcpConfig;
|
|
18
|
+
|
|
19
|
+
declare class NaparnikApiClient {
|
|
20
|
+
private readonly config;
|
|
21
|
+
constructor(config: NaparnikMcpConfig);
|
|
22
|
+
/**
|
|
23
|
+
* POST к sdk-эндпоинту. Все automation-эндпоинты только POST — таково
|
|
24
|
+
* ограничение VerbFilter на сервере, отдельного GET-пути нет.
|
|
25
|
+
*
|
|
26
|
+
* @param path путь относительно /api/internal/automation/sdk
|
|
27
|
+
* @param body тело запроса
|
|
28
|
+
* @param opts long: использовать увеличенный таймаут (генерация, поиск)
|
|
29
|
+
*/
|
|
30
|
+
post<T>(path: string, body?: unknown, opts?: {
|
|
31
|
+
long?: boolean;
|
|
32
|
+
}): Promise<T>;
|
|
33
|
+
private attempt;
|
|
34
|
+
private parse;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
declare function createNaparnikTools(client: NaparnikApiClient): Tool[];
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Иерархия ошибок клиента Напарника.
|
|
41
|
+
*
|
|
42
|
+
* Порт модели ошибок Python SDK (`shared/python-sdk/runtime/naparnik_sdk/`),
|
|
43
|
+
* которая проверена в бою на pipeline-скриптах. Главное в ней — разделение
|
|
44
|
+
* «ретрай поможет» / «ретрай бесполезен»: без него клиент, упёршийся в нехватку
|
|
45
|
+
* прав, добросовестно долбит эндпоинт с backoff'ом, пока не упрётся в лимиты.
|
|
46
|
+
*
|
|
47
|
+
* Отдельно от Python-версии здесь выделена нехватка средств: у внешнего клиента
|
|
48
|
+
* нет нашего UI, поэтому ошибка обязана нести ссылку и сумму, а не только текст.
|
|
49
|
+
*/
|
|
50
|
+
/** Базовая ошибка обращения к API Напарника. */
|
|
51
|
+
declare class NaparnikError extends Error {
|
|
52
|
+
readonly cause?: unknown | undefined;
|
|
53
|
+
constructor(message: string, cause?: unknown | undefined);
|
|
54
|
+
/**
|
|
55
|
+
* Имеет ли смысл повторять запрос. По умолчанию нет: повтор — осознанное
|
|
56
|
+
* решение для конкретных подклассов, а не поведение по умолчанию.
|
|
57
|
+
*/
|
|
58
|
+
get retryable(): boolean;
|
|
59
|
+
}
|
|
60
|
+
/** 401 — ключ не признан: не тот формат, отозван, истёк. */
|
|
61
|
+
declare class NaparnikAuthError extends NaparnikError {
|
|
62
|
+
}
|
|
63
|
+
/** 403 — ключ валиден, но у него нет права на эту операцию. */
|
|
64
|
+
declare class NaparnikScopeError extends NaparnikError {
|
|
65
|
+
readonly requiredScope?: string | undefined;
|
|
66
|
+
constructor(message: string, requiredScope?: string | undefined);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* 402 — не хватает денег. Отдельный класс, потому что это единственная ошибка,
|
|
70
|
+
* которую пользователь может исправить сам и прямо сейчас: у неё есть сумма и
|
|
71
|
+
* ссылка, и MCP-тул обязан показать их человеку, а не прятать в стек.
|
|
72
|
+
*/
|
|
73
|
+
declare class NaparnikInsufficientBalanceError extends NaparnikError {
|
|
74
|
+
readonly details: {
|
|
75
|
+
/** Что упёрлось: баланс компании или дневной потолок ключа. */
|
|
76
|
+
limit: 'company_balance' | 'token_daily';
|
|
77
|
+
balanceRub: number;
|
|
78
|
+
requiredRub: number;
|
|
79
|
+
/** Куда идти пополнять (или менять лимит ключа). */
|
|
80
|
+
actionUrl: string;
|
|
81
|
+
};
|
|
82
|
+
constructor(message: string, details: {
|
|
83
|
+
/** Что упёрлось: баланс компании или дневной потолок ключа. */
|
|
84
|
+
limit: 'company_balance' | 'token_daily';
|
|
85
|
+
balanceRub: number;
|
|
86
|
+
requiredRub: number;
|
|
87
|
+
/** Куда идти пополнять (или менять лимит ключа). */
|
|
88
|
+
actionUrl: string;
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Прочие 4xx — запрос сформирован неверно. Повтор с тем же телом даст тот же
|
|
93
|
+
* результат, поэтому не ретраим: пусть LLM увидит ошибку и исправит аргументы.
|
|
94
|
+
*/
|
|
95
|
+
declare class NaparnikClientError extends NaparnikError {
|
|
96
|
+
readonly status: number;
|
|
97
|
+
readonly body?: string | undefined;
|
|
98
|
+
constructor(message: string, status: number, body?: string | undefined);
|
|
99
|
+
}
|
|
100
|
+
/** 5xx, сетевой сбой, недоступность — здесь повтор осмыслен. */
|
|
101
|
+
declare class NaparnikServerError extends NaparnikError {
|
|
102
|
+
readonly status?: number | undefined;
|
|
103
|
+
readonly body?: string | undefined;
|
|
104
|
+
constructor(message: string, status?: number | undefined, body?: string | undefined);
|
|
105
|
+
get retryable(): boolean;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Таймаут запроса. Ретраить НЕ ретраим осознанно: сервер, вероятно, всё ещё
|
|
109
|
+
* выполняет операцию, и повтор либо удвоит нагрузку, либо приведёт к двойному
|
|
110
|
+
* списанию на платных вызовах. Тот же вывод зафиксирован в phpApiCall.
|
|
111
|
+
*/
|
|
112
|
+
declare class NaparnikTimeoutError extends NaparnikError {
|
|
113
|
+
}
|
|
114
|
+
/** Ключ не задан или задан в неверном формате — ошибка конфигурации клиента. */
|
|
115
|
+
declare class NaparnikConfigError extends NaparnikError {
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
export { NaparnikApiClient, NaparnikAuthError, NaparnikClientError, NaparnikConfigError, NaparnikError, NaparnikInsufficientBalanceError, type NaparnikMcpConfig, NaparnikScopeError, NaparnikServerError, NaparnikTimeoutError, createNaparnikTools, loadConfig };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { NaparnikApiClient, NaparnikAuthError, NaparnikClientError, NaparnikConfigError, NaparnikError, NaparnikInsufficientBalanceError, NaparnikScopeError, NaparnikServerError, NaparnikTimeoutError, createNaparnikTools, loadConfig } from './chunk-T6UWKM37.js';
|
package/package.json
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@naparnik/mcp",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "MCP-сервер Напарника: подключает рилсы, распаковку бренда, генерацию изображений и баланс к вашему Claude.",
|
|
5
|
+
"license": "SEE LICENSE IN LICENSE.md",
|
|
6
|
+
"private": false,
|
|
7
|
+
"type": "module",
|
|
8
|
+
"main": "dist/index.js",
|
|
9
|
+
"types": "dist/index.d.ts",
|
|
10
|
+
"bin": {
|
|
11
|
+
"naparnik-mcp": "dist/cli.js"
|
|
12
|
+
},
|
|
13
|
+
"exports": {
|
|
14
|
+
".": {
|
|
15
|
+
"types": "./dist/index.d.ts",
|
|
16
|
+
"import": "./dist/index.js"
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
"engines": {
|
|
20
|
+
"node": ">=20"
|
|
21
|
+
},
|
|
22
|
+
"publishConfig": {
|
|
23
|
+
"access": "public"
|
|
24
|
+
},
|
|
25
|
+
"repository": {
|
|
26
|
+
"type": "git",
|
|
27
|
+
"url": "https://gitlab.com/shamysev/ai-naparnik.git",
|
|
28
|
+
"directory": "new-version/shared/mcp"
|
|
29
|
+
},
|
|
30
|
+
"homepage": "https://naparnik.ai",
|
|
31
|
+
"scripts": {
|
|
32
|
+
"build": "tsup",
|
|
33
|
+
"test": "vitest run",
|
|
34
|
+
"typecheck": "tsc --noEmit",
|
|
35
|
+
"prepublishOnly": "npm run build && npm run test"
|
|
36
|
+
},
|
|
37
|
+
"files": [
|
|
38
|
+
"dist",
|
|
39
|
+
"README.md",
|
|
40
|
+
"LICENSE.md"
|
|
41
|
+
],
|
|
42
|
+
"keywords": [
|
|
43
|
+
"mcp",
|
|
44
|
+
"model-context-protocol",
|
|
45
|
+
"claude",
|
|
46
|
+
"naparnik",
|
|
47
|
+
"reels"
|
|
48
|
+
],
|
|
49
|
+
"dependencies": {},
|
|
50
|
+
"devDependencies": {
|
|
51
|
+
"@naparnik/api-contracts": "file:../api-contracts",
|
|
52
|
+
"@naparnik/super-agent-core": "file:../../super-agent-core",
|
|
53
|
+
"@types/node": "^22.0.0",
|
|
54
|
+
"tsup": "^8.5.1",
|
|
55
|
+
"typescript": "^5.4.0",
|
|
56
|
+
"vitest": "^3.2.4"
|
|
57
|
+
}
|
|
58
|
+
}
|