@vennyx/solicrm-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 +21 -0
- package/README.md +100 -0
- package/dist/bin.js +4097 -0
- package/dist/index.d.ts +399 -0
- package/dist/index.js +4140 -0
- package/package.json +57 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,399 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { McpServer, RegisteredPrompt, RegisteredResourceTemplate, RegisteredTool } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
3
|
+
import { ActivityListQuery, CrmListQuery, SearchParams, SolicrmApiError, SolicrmClient, SolicrmError, SolicrmResponseError } from "@vennyx/solicrm";
|
|
4
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
5
|
+
//#region packages/contracts/src/api-keys.d.ts
|
|
6
|
+
declare const apiKeyScopeSchema: z.ZodEnum<{
|
|
7
|
+
admin: "admin";
|
|
8
|
+
read: "read";
|
|
9
|
+
write: "write";
|
|
10
|
+
}>;
|
|
11
|
+
type ApiKeyScope = z.infer<typeof apiKeyScopeSchema>;
|
|
12
|
+
//#endregion
|
|
13
|
+
//#region packages/contracts/src/fields.d.ts
|
|
14
|
+
/**
|
|
15
|
+
* Alan kataloğu — `field_key` → kolon/tip/yetenek eşlemesi.
|
|
16
|
+
*
|
|
17
|
+
* NEDEN VAR: kaydedilmiş görünümler, filtreler, sıralama, CSV içe/dışa aktarma
|
|
18
|
+
* ve MCP/SDK tip üretimi HEPSİ bu katalogdan okur. Hiçbir yerde kullanıcıdan
|
|
19
|
+
* gelen bir değer doğrudan kolon adına dönüşmez — `resolveField()` bilinmeyen
|
|
20
|
+
* anahtar için `undefined` döner ve çağıran 400 verir. Bu, SQL enjeksiyonu ve
|
|
21
|
+
* bilgi sızdırmanın sınırıdır.
|
|
22
|
+
*
|
|
23
|
+
* İLERİYE DÖNÜK: özel alanlar (custom fields) eklendiğinde katalog runtime'da
|
|
24
|
+
* tenant'ın tanımlarıyla genişletilir; tüketici kod değişmez (bkz. spec §6.7).
|
|
25
|
+
*/
|
|
26
|
+
declare const CRM_RESOURCES: readonly ['contacts', 'companies', 'deals', 'tasks'];
|
|
27
|
+
type CrmResource = (typeof CRM_RESOURCES)[number];
|
|
28
|
+
//#endregion
|
|
29
|
+
//#region packages/mcp/dist/client.d.ts
|
|
30
|
+
/**
|
|
31
|
+
* ARGÜMANLARI SDK'nın imzasından AYNEN alır, DÖNÜŞ tipini `Promise<unknown>`'a
|
|
32
|
+
* genişletir.
|
|
33
|
+
*
|
|
34
|
+
* NEDEN DÖNÜŞ GEVŞEK: MCP katmanı hiçbir yanıt alanını OKUMAZ — her araç
|
|
35
|
+
* sonucu doğrudan `jsonResult()`'a, yani `JSON.stringify`'a gider. Dönüş
|
|
36
|
+
* tipini burada sıkı tutmak sıfır güvenlik/doğruluk kazancı sağlar ama sahte
|
|
37
|
+
* bir istemcinin tipi karşılamasını İMKÂNSIZ kılar ⇒ testler ancak `as`
|
|
38
|
+
* cast'iyle yazılabilirdi (yasak). Yük TAŞIYAN taraf ARGÜMANLARDIR ve onlar
|
|
39
|
+
* TAM SIKI kalır: `CallOptions` (`{ tenantId }`) parametresinin kaçıncı
|
|
40
|
+
* argüman olduğu, gövde şemalarının contracts tipleriyle uyumu ve id
|
|
41
|
+
* parametrelerinin `string`liği hepsi SDK'nın kendi imzasından gelir.
|
|
42
|
+
* Gerçek `SolicrmClient` bunu karşılar (fonksiyon dönüşleri KOVARYANT).
|
|
43
|
+
*/
|
|
44
|
+
type LoosenResult<TFn> = TFn extends ((...args: infer TArgs) => Promise<unknown>) ? (...args: TArgs) => Promise<unknown> : never;
|
|
45
|
+
type LoosenResource<TResource> = { [K in keyof TResource]: LoosenResult<TResource[K]>; };
|
|
46
|
+
interface McpSolicrmClient {
|
|
47
|
+
contacts: LoosenResource<Pick<SolicrmClient['contacts'], 'list' | 'get' | 'create' | 'update'>>;
|
|
48
|
+
companies: LoosenResource<Pick<SolicrmClient['companies'], 'list' | 'get' | 'create' | 'update'>>;
|
|
49
|
+
deals: LoosenResource<Pick<SolicrmClient['deals'], 'list' | 'get' | 'create' | 'update' | 'move'>>;
|
|
50
|
+
pipelines: LoosenResource<Pick<SolicrmClient['pipelines'], 'list'>>;
|
|
51
|
+
activities: LoosenResource<Pick<SolicrmClient['activities'], 'list' | 'create'>>;
|
|
52
|
+
tasks: LoosenResource<Pick<SolicrmClient['tasks'], 'list' | 'create' | 'complete'>>;
|
|
53
|
+
notes: LoosenResource<Pick<SolicrmClient['notes'], 'create'>>;
|
|
54
|
+
search: LoosenResource<Pick<SolicrmClient['search'], 'query'>>;
|
|
55
|
+
views: LoosenResource<Pick<SolicrmClient['views'], 'list'>>;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* TİP DÜZEYİ KANIT — gerçek `SolicrmClient` bu dar yüzeyi KARŞILIYOR.
|
|
59
|
+
* Fonksiyon hiç ÇAĞRILMAZ; tek işi `tsc -b`'yi bir sapmada kırmaktır (bir
|
|
60
|
+
* metot adı değişir/kaldırılırsa derleme burada patlar). `as` cast'i YOK,
|
|
61
|
+
* çalışma zamanı maliyeti YOK.
|
|
62
|
+
*/
|
|
63
|
+
declare function assertSolicrmClientSatisfiesMcpSurface(client: SolicrmClient): McpSolicrmClient;
|
|
64
|
+
//#endregion
|
|
65
|
+
//#region packages/mcp/dist/config.d.ts
|
|
66
|
+
interface McpConfig {
|
|
67
|
+
apiKey: string;
|
|
68
|
+
tenantId: string;
|
|
69
|
+
/** Verilmezse `@vennyx/solicrm`'in `DEFAULT_BASE_URL`'ü kullanılır */
|
|
70
|
+
baseUrl: string | undefined;
|
|
71
|
+
/** Bkz. KRİTİK KURAL 3 — yalnız `tools/list` filtresi */
|
|
72
|
+
scope: ApiKeyScope;
|
|
73
|
+
}
|
|
74
|
+
/** Bkz. KRİTİK KURAL 3 — kapsam verilmediğinde sunucuyu yetkili taraf sayarız */
|
|
75
|
+
declare const DEFAULT_MCP_SCOPE: ApiKeyScope;
|
|
76
|
+
/** `process.env` biçiminde okunabilen minimal yüzey (testte düz obje geçilir) */
|
|
77
|
+
type McpEnv = Record<string, string | undefined>;
|
|
78
|
+
declare function loadConfigFromEnv(env: McpEnv): McpConfig;
|
|
79
|
+
//#endregion
|
|
80
|
+
//#region packages/mcp/dist/transports/http.d.ts
|
|
81
|
+
/** Bkz. KRİTİK KURAL 1(a) */
|
|
82
|
+
declare const DEFAULT_HTTP_HOST = "127.0.0.1";
|
|
83
|
+
declare const DEFAULT_HTTP_PORT = 3737;
|
|
84
|
+
/** `--http` sunucusunun MCP yolu */
|
|
85
|
+
declare const MCP_HTTP_PATH = "/mcp";
|
|
86
|
+
declare const BROWSER_ORIGIN_REJECTED_MESSAGE = "Tarayıcıdan gelen istekler reddedilir (Origin başlığı taşıyor).";
|
|
87
|
+
interface McpHttpHandlerDeps {
|
|
88
|
+
/** Her istek için TAZE bir sunucu üretir (bkz. KRİTİK KURAL 3) */
|
|
89
|
+
createServer: () => McpServer;
|
|
90
|
+
}
|
|
91
|
+
/** Bkz. KRİTİK KURAL 1(b) — saf, tek satırlık, ayrı test edilebilir karar */
|
|
92
|
+
declare function hasBrowserOrigin(request: Request): boolean;
|
|
93
|
+
/**
|
|
94
|
+
* `Request → Response`. Port açmaz, soket kurmaz ⇒ testte doğrudan çağrılır.
|
|
95
|
+
* Protokol hataları JSON-RPC zarfıyla transport'tan gelir; BU katmanın kendi
|
|
96
|
+
* redleri (405/404/403) `{error}` zarfını kullanır — hosted uçtaki AYNI ayrım
|
|
97
|
+
* (bkz. `apps/api/src/routes/mcp.ts` KRİTİK KURAL 5).
|
|
98
|
+
*/
|
|
99
|
+
declare function createMcpHttpHandler(deps: McpHttpHandlerDeps): (request: Request) => Promise<Response>;
|
|
100
|
+
interface McpHttpServerOptions {
|
|
101
|
+
handler: (request: Request) => Promise<Response>;
|
|
102
|
+
port?: number | undefined;
|
|
103
|
+
host?: string | undefined;
|
|
104
|
+
}
|
|
105
|
+
interface RunningMcpHttpServer {
|
|
106
|
+
host: string;
|
|
107
|
+
port: number;
|
|
108
|
+
close: () => Promise<void>;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* `node:http` yapıştırıcısı — Node ve Bun'da AYNI şekilde çalışır (`Bun.serve`
|
|
112
|
+
* kullanılmadı: paket npm'e yayınlanıyor ve `npx` altında Node ile koşuyor).
|
|
113
|
+
*/
|
|
114
|
+
declare function startMcpHttpServer(options: McpHttpServerOptions): Promise<RunningMcpHttpServer>;
|
|
115
|
+
//#endregion
|
|
116
|
+
//#region packages/mcp/dist/cli.d.ts
|
|
117
|
+
type McpTransportKind = 'stdio' | 'http';
|
|
118
|
+
interface CliArgs {
|
|
119
|
+
transport: McpTransportKind;
|
|
120
|
+
/** Yalnız `transport === 'http'` iken anlamlı; verilmemişse `undefined` */
|
|
121
|
+
port: number | undefined;
|
|
122
|
+
/** `--help` / `-h` verildi mi */
|
|
123
|
+
help: boolean;
|
|
124
|
+
/** `--version` / `-v` verildi mi */
|
|
125
|
+
version: boolean;
|
|
126
|
+
}
|
|
127
|
+
declare const USAGE = "solicrm-mcp — SoliCRM MCP sunucusu (v0.1.0)\n\nKullanım:\n solicrm-mcp stdio taşımasıyla başlar (varsayılan)\n solicrm-mcp --http [port] bağımsız Streamable HTTP sunucusu (varsayılan port 3737)\n solicrm-mcp --help bu metni yazar\n solicrm-mcp --version sürümü yazar\n\nOrtam değişkenleri:\n SOLICRM_API_KEY (zorunlu) scrm_ ile başlayan tenant API anahtarı\n SOLICRM_TENANT_ID (zorunlu) kiracı kimliği (UUID)\n SOLICRM_BASE_URL (opsiyonel) API tabanı; verilmezse https://api.solicrm.com\n SOLICRM_SCOPE (opsiyonel) read|write|admin — yalnız tools/list filtresi,\n gerçek yetki sunucuda her istekte yeniden hesaplanır";
|
|
128
|
+
/** Bkz. KRİTİK KURAL 3 */
|
|
129
|
+
declare function parsePort(raw: string): number;
|
|
130
|
+
declare function parseCliArgs(argv: readonly string[]): CliArgs;
|
|
131
|
+
interface RunCliDeps {
|
|
132
|
+
env?: McpEnv | undefined;
|
|
133
|
+
loadConfig?: ((env: McpEnv) => McpConfig) | undefined;
|
|
134
|
+
/** Kurulmuş bir SDK istemcisi üretir (gerçek uygulama `@vennyx/solicrm`'i kullanır) */
|
|
135
|
+
createClient?: ((config: McpConfig) => McpSolicrmClient) | undefined;
|
|
136
|
+
createServer?: ((client: McpSolicrmClient, scope: ApiKeyScope) => McpServer) | undefined;
|
|
137
|
+
connectStdio?: ((server: McpServer) => Promise<unknown>) | undefined;
|
|
138
|
+
startHttp?: ((args: {
|
|
139
|
+
handler: (request: Request) => Promise<Response>;
|
|
140
|
+
port: number | undefined;
|
|
141
|
+
}) => Promise<RunningMcpHttpServer>) | undefined;
|
|
142
|
+
/** İnsana yönelik çıktı — bkz. KRİTİK KURAL 2 */
|
|
143
|
+
log?: ((message: string) => void) | undefined;
|
|
144
|
+
}
|
|
145
|
+
declare function runCli(argv: readonly string[], deps?: RunCliDeps): Promise<void>;
|
|
146
|
+
//#endregion
|
|
147
|
+
//#region packages/mcp/dist/errors.d.ts
|
|
148
|
+
/**
|
|
149
|
+
* MCP katmanının KENDİ hata sınıfları — sunucudan GELMEYEN, bu paketin
|
|
150
|
+
* ürettiği başarısızlıklar.
|
|
151
|
+
*
|
|
152
|
+
* DİL İSTİSNASI (Global Constraints #8): buradaki mesajlar İngilizce'dir.
|
|
153
|
+
* "Kullanıcıya dönen mesajlar Türkçe" kuralı `apps/api`'nin `jsonError()`
|
|
154
|
+
* zarfı içindir; bu paket global npm tüketicilerine (Claude Code/Desktop) gider
|
|
155
|
+
* ve mesajları bir LLM okur. Sunucudan gelen TÜRKÇE metin ise ÇEVRİLMEZ,
|
|
156
|
+
* `toMcpToolError` onu AYNEN taşır (bkz. `result.ts`).
|
|
157
|
+
*/
|
|
158
|
+
/** Bu paketin ürettiği her hatanın taban sınıfı — tüketici tek `catch` ile kapsar. */
|
|
159
|
+
declare class SolicrmMcpError extends Error {
|
|
160
|
+
constructor(message: string);
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Çağıranın etkin kapsamı aracın gerektirdiği minimumun ALTINDA.
|
|
164
|
+
*
|
|
165
|
+
* KRİTİK KURAL — bu hata TEK yetki sınırı DEĞİLDİR, İKİNCİ katmandır. Gerçek
|
|
166
|
+
* yetki kontrolü sunucu tarafındadır: her araç çağrısı SDK üzerinden
|
|
167
|
+
* `/v1/tenants/:id/...` uçlarına gider ve orada
|
|
168
|
+
* `checkApiKeyTenantAndScope` (`apps/api/src/lib/crm-access.ts`) çalışır — o
|
|
169
|
+
* kontrol `effectiveScope`'u (= `ROLE_SCOPE_CEILING[güncel rol] ∩ anahtar
|
|
170
|
+
* kapsamı`) HER istekte DB'den YENİDEN hesaplar. Bu paketteki `scope` ise
|
|
171
|
+
* sunucu kurulurken bir kez alınmış bir ANLIK GÖRÜNTÜDÜR (bkz. `scope.ts`).
|
|
172
|
+
*/
|
|
173
|
+
declare class McpScopeError extends SolicrmMcpError {
|
|
174
|
+
readonly toolName: string;
|
|
175
|
+
readonly requiredScope: string;
|
|
176
|
+
readonly actualScope: string;
|
|
177
|
+
constructor(params: {
|
|
178
|
+
toolName: string;
|
|
179
|
+
requiredScope: string;
|
|
180
|
+
actualScope: string;
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Araç girdisi zod şemasını GEÇTİ ama anlamsal olarak tutarsız (ör. sıralama
|
|
185
|
+
* yönü verilmiş, sıralanacak alan verilmemiş).
|
|
186
|
+
*
|
|
187
|
+
* NEDEN AYRI BİR HATA: bu projenin "fail-open savunma savunma değildir"
|
|
188
|
+
* dersinin doğrudan uygulaması — tutarsız girdiyi SESSİZCE yok saymak
|
|
189
|
+
* (`sortDirection`'ı görmezden gelip sırasız sonuç döndürmek) çağırana
|
|
190
|
+
* "istediğin sıralamayı yaptım" yalanını söylerdi.
|
|
191
|
+
*/
|
|
192
|
+
declare class McpInputError extends SolicrmMcpError {
|
|
193
|
+
constructor(message: string);
|
|
194
|
+
}
|
|
195
|
+
//#endregion
|
|
196
|
+
//#region packages/mcp/dist/list-input.d.ts
|
|
197
|
+
/**
|
|
198
|
+
* Bir CRM kaynağı için liste aracı girdi şeması. Alan adları o kaynağın
|
|
199
|
+
* `FIELD_CATALOG` girdisine karşı doğrulanır (bkz. KRİTİK KURAL 4).
|
|
200
|
+
*/
|
|
201
|
+
declare function buildCrmListInputSchema(resource: CrmResource): z.ZodObject<{
|
|
202
|
+
cursor: z.ZodOptional<z.ZodString>;
|
|
203
|
+
limit: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
|
|
204
|
+
sortField: z.ZodOptional<z.ZodString>;
|
|
205
|
+
sortDirection: z.ZodOptional<z.ZodEnum<{
|
|
206
|
+
asc: "asc";
|
|
207
|
+
desc: "desc";
|
|
208
|
+
}>>;
|
|
209
|
+
filters: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
210
|
+
}, z.core.$strip>;
|
|
211
|
+
type CrmListInput = z.infer<ReturnType<typeof buildCrmListInputSchema>>;
|
|
212
|
+
/**
|
|
213
|
+
* Araç girdisini SDK'nın `CrmListQuery`'sine çevirir. `tenantId` DİYE BİR ALAN
|
|
214
|
+
* YOKTUR ve olamaz — tenant her zaman `SolicrmClient`'ın kurulduğu andaki
|
|
215
|
+
* değerdir (bkz. `server.ts` dosya başı).
|
|
216
|
+
*/
|
|
217
|
+
declare function toCrmListQuery(args: CrmListInput): CrmListQuery;
|
|
218
|
+
/**
|
|
219
|
+
* Bir kaynağın sıralanabilir/filtrelenebilir alanlarını araç açıklamasına
|
|
220
|
+
* yazılacak metne çevirir — LLM'in geçersiz alan adı denemesini azaltır.
|
|
221
|
+
* Liste `FIELD_CATALOG`'dan ÜRETİLİR, elle yazılmaz.
|
|
222
|
+
*/
|
|
223
|
+
declare function describeCrmListFields(resource: CrmResource): string;
|
|
224
|
+
//#endregion
|
|
225
|
+
//#region packages/mcp/dist/prompts.d.ts
|
|
226
|
+
declare const MCP_PROMPT_NAMES: readonly ['summarize_pipeline'];
|
|
227
|
+
declare function registerSummarizePipelinePrompt(server: McpServer): RegisteredPrompt;
|
|
228
|
+
//#endregion
|
|
229
|
+
//#region packages/mcp/dist/resources.d.ts
|
|
230
|
+
declare const MCP_RESOURCE_NAMES: readonly ['contact', 'deal'];
|
|
231
|
+
type McpResourceName = (typeof MCP_RESOURCE_NAMES)[number];
|
|
232
|
+
/** Kaynak → gereken minimum kapsam. `TOOL_MIN_SCOPE` gibi TOTAL (fail-open yok). */
|
|
233
|
+
declare const RESOURCE_MIN_SCOPE: Record<McpResourceName, ApiKeyScope>;
|
|
234
|
+
/** URI şablonu değişkeni tek değer de dizi de olabilir — ilkini alır, yoksa hata. */
|
|
235
|
+
declare function firstVariable(value: string | string[] | undefined, name: string): string;
|
|
236
|
+
declare function registerCrmResources(server: McpServer, client: McpSolicrmClient, scope: ApiKeyScope): Array<[McpResourceName, RegisteredResourceTemplate]>;
|
|
237
|
+
//#endregion
|
|
238
|
+
//#region packages/mcp/dist/result.d.ts
|
|
239
|
+
/** Beklenmeyen (bizim kusurumuz olan) hatalar için TEK jenerik metin. */
|
|
240
|
+
declare const UNEXPECTED_ERROR_MESSAGE = "An unexpected error occurred while calling the SoliCRM API.";
|
|
241
|
+
/**
|
|
242
|
+
* SDK'nın hata sınıflarının `this.name` değerlerinin KAPALI listesi. Listede
|
|
243
|
+
* OLMAYAN her şey jenerik metne düşer (fail-closed).
|
|
244
|
+
*/
|
|
245
|
+
declare const SDK_ERROR_NAMES: readonly string[];
|
|
246
|
+
/** `SolicrmApiError`'ın bu modülün OKUDUĞU alanları — yapısal sözleşme. */
|
|
247
|
+
interface ApiErrorShape {
|
|
248
|
+
status: number;
|
|
249
|
+
body: unknown;
|
|
250
|
+
serverMessage: string | undefined;
|
|
251
|
+
message: string;
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* TİP DÜZEYİ KANIT (a): gerçek `SolicrmApiError` yukarıdaki yapısal sözleşmeyi
|
|
255
|
+
* KARŞILIYOR. Hiç çağrılmaz; tek işi bir sapmada `tsc -b`'yi kırmaktır.
|
|
256
|
+
*/
|
|
257
|
+
declare function assertApiErrorShape(err: SolicrmApiError): ApiErrorShape;
|
|
258
|
+
/**
|
|
259
|
+
* TİP DÜZEYİ KANIT (a-2): `SDK_ERROR_NAMES`'in karşılık geldiği ÜÇ sınıf
|
|
260
|
+
* gerçekten var ve hepsi `Error` alt sınıfı. Biri kaldırılır/yeniden
|
|
261
|
+
* adlandırılırsa import satırı ve bu imza DERLENMEZ.
|
|
262
|
+
*/
|
|
263
|
+
declare function assertSdkErrorNames(errors: [SolicrmError, SolicrmApiError, SolicrmResponseError]): Error[];
|
|
264
|
+
/**
|
|
265
|
+
* `@modelcontextprotocol/sdk`'nın `CallToolResult` şeklinin bu paketin ihtiyacı
|
|
266
|
+
* kadarlık dar karşılığı. SDK'nın gerçek zod şeması `[x: string]: unknown`
|
|
267
|
+
* (loose) taşır — bu tip de UYUMLU kalmak için aynısını taşır.
|
|
268
|
+
*/
|
|
269
|
+
interface ToolTextResult {
|
|
270
|
+
[key: string]: unknown;
|
|
271
|
+
content: {
|
|
272
|
+
type: 'text';
|
|
273
|
+
text: string;
|
|
274
|
+
}[];
|
|
275
|
+
isError?: boolean;
|
|
276
|
+
}
|
|
277
|
+
/** Her aracın ORTAK başarı biçimi — veriyi okunabilir (girintili) JSON metne çevirir. */
|
|
278
|
+
declare function jsonResult(data: unknown): ToolTextResult;
|
|
279
|
+
/** Bir hatayı MCP'nin `isError: true` sonucuna çevirir (JSON-RPC hatası DEĞİL). */
|
|
280
|
+
declare function toMcpToolError(err: unknown): ToolTextResult;
|
|
281
|
+
//#endregion
|
|
282
|
+
//#region packages/mcp/dist/scope.d.ts
|
|
283
|
+
/**
|
|
284
|
+
* Kayıtlı TÜM araçların kanonik ad listesi (spec §12.1'in 22 aracı — `search`
|
|
285
|
+
* dâhil; plan metninin "21 araç" sayımı hatalıdır, `search` ZATEN §12.1
|
|
286
|
+
* listesindedir, ona EK değildir).
|
|
287
|
+
*
|
|
288
|
+
* Bu dizi TEK gerçek kaynaktır: `TOOL_MIN_SCOPE` ondan tiplenir ve
|
|
289
|
+
* `test/server.test.ts` `tools/list` çıktısının bununla BİREBİR eşleştiğini
|
|
290
|
+
* doğrular.
|
|
291
|
+
*/
|
|
292
|
+
declare const MCP_TOOL_NAMES: readonly ['list_contacts', 'get_contact', 'create_contact', 'update_contact', 'list_companies', 'get_company', 'create_company', 'update_company', 'list_deals', 'get_deal', 'create_deal', 'update_deal', 'move_deal_stage', 'list_pipelines', 'list_activities', 'create_activity', 'list_tasks', 'create_task', 'complete_task', 'create_note', 'search', 'list_saved_views'];
|
|
293
|
+
type McpToolName = (typeof MCP_TOOL_NAMES)[number];
|
|
294
|
+
/**
|
|
295
|
+
* Kapsam rütbeleri — `apps/api/src/lib/api-key-auth.ts`'in `SCOPE_RANK`'ıyla
|
|
296
|
+
* BİREBİR aynı. İçe aktarılMAZ çünkü bu paket npm'e yayınlanır ve `apps/api`'ye
|
|
297
|
+
* (Hono, Drizzle, Postgres) bağımlı OLAMAZ. Drift riski TİP SEVİYESİNDE
|
|
298
|
+
* kapatılmıştır: `Record<ApiKeyScope, number>` `@solicrm/contracts`'ın
|
|
299
|
+
* `apiKeyScopeSchema` enum'una bağlıdır ⇒ contracts'a dördüncü bir kapsam
|
|
300
|
+
* eklenirse bu satır DERLENMEZ.
|
|
301
|
+
*/
|
|
302
|
+
declare const SCOPE_RANK: Record<ApiKeyScope, number>;
|
|
303
|
+
/** `SCOPE_RANK`'ın anahtar kümesinin contracts'la aynı olduğunu ÇALIŞMA ZAMANINDA da kanıtlanabilir kılar. */
|
|
304
|
+
declare const API_KEY_SCOPES: readonly ApiKeyScope[];
|
|
305
|
+
declare const TOOL_MIN_SCOPE: Record<McpToolName, ApiKeyScope>;
|
|
306
|
+
/** `actual`, `required` kapsamını karşılıyor mu (read < write < admin) */
|
|
307
|
+
declare function scopeSatisfies(actual: ApiKeyScope, required: ApiKeyScope): boolean;
|
|
308
|
+
/**
|
|
309
|
+
* Çağrı-anı kapsam kapısı — HER araç handler'ının İLK satırı (bkz. KRİTİK
|
|
310
|
+
* KURAL 3/b). Yetersizse fırlatır; `toMcpToolError` bunu `isError: true`
|
|
311
|
+
* sonucuna çevirir.
|
|
312
|
+
*/
|
|
313
|
+
declare function assertScope(scope: ApiKeyScope, toolName: McpToolName): void;
|
|
314
|
+
//#endregion
|
|
315
|
+
//#region packages/mcp/dist/server.d.ts
|
|
316
|
+
/** `dist/cli.js`'nin (Task 4) `package.json` okumadan taşıdığı sürüm sabiti. */
|
|
317
|
+
declare const SOLICRM_MCP_VERSION = "0.1.0";
|
|
318
|
+
declare const SOLICRM_MCP_SERVER_NAME = "solicrm";
|
|
319
|
+
/**
|
|
320
|
+
* Verilen istemci ve etkin kapsam için TAZE bir `McpServer` kurar.
|
|
321
|
+
*
|
|
322
|
+
* @param client Kurulmuş `SolicrmClient` — `tenantId`'si (ve API anahtarı)
|
|
323
|
+
* çağıranın kimliğinden gelir; bu fonksiyon onu SORGULAMAZ ve DEĞİŞTİRMEZ.
|
|
324
|
+
* @param scope Çağıranın ŞU ANDAKİ etkin kapsamı (`ROLE_SCOPE_CEILING[rol] ∩
|
|
325
|
+
* anahtar kapsamı`). Anlık görüntüdür — bkz. `scope.ts` KRİTİK KURAL 2.
|
|
326
|
+
*/
|
|
327
|
+
declare function createSolicrmMcpServer(client: McpSolicrmClient, scope: ApiKeyScope): McpServer;
|
|
328
|
+
//#endregion
|
|
329
|
+
//#region packages/mcp/dist/tools/activities.d.ts
|
|
330
|
+
declare const listActivitiesInputSchema: z.ZodObject<{
|
|
331
|
+
cursor: z.ZodOptional<z.ZodString>;
|
|
332
|
+
limit: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
|
|
333
|
+
targetType: z.ZodOptional<z.ZodEnum<{
|
|
334
|
+
company: "company";
|
|
335
|
+
contact: "contact";
|
|
336
|
+
deal: "deal";
|
|
337
|
+
}>>;
|
|
338
|
+
targetId: z.ZodOptional<z.ZodUUID>;
|
|
339
|
+
}, z.core.$strip>;
|
|
340
|
+
type ListActivitiesInput = z.infer<typeof listActivitiesInputSchema>;
|
|
341
|
+
declare function toActivityListQuery(args: ListActivitiesInput): ActivityListQuery;
|
|
342
|
+
declare function registerActivityTools(server: McpServer, client: McpSolicrmClient, scope: ApiKeyScope): Array<[McpToolName, RegisteredTool]>;
|
|
343
|
+
//#endregion
|
|
344
|
+
//#region packages/mcp/dist/tools/companies.d.ts
|
|
345
|
+
declare function registerCompanyTools(server: McpServer, client: McpSolicrmClient, scope: ApiKeyScope): Array<[McpToolName, RegisteredTool]>;
|
|
346
|
+
//#endregion
|
|
347
|
+
//#region packages/mcp/dist/tools/contacts.d.ts
|
|
348
|
+
declare function registerContactTools(server: McpServer, client: McpSolicrmClient, scope: ApiKeyScope): Array<[McpToolName, RegisteredTool]>;
|
|
349
|
+
//#endregion
|
|
350
|
+
//#region packages/mcp/dist/tools/deals.d.ts
|
|
351
|
+
declare function registerDealTools(server: McpServer, client: McpSolicrmClient, scope: ApiKeyScope): Array<[McpToolName, RegisteredTool]>;
|
|
352
|
+
//#endregion
|
|
353
|
+
//#region packages/mcp/dist/tools/define.d.ts
|
|
354
|
+
/**
|
|
355
|
+
* Bir araç handler'ını MCP callback'ine çevirir: kapsam kapısı → handler →
|
|
356
|
+
* `jsonResult`; her fırlatma `isError: true` sonucuna dönüşür (JSON-RPC
|
|
357
|
+
* hatasına DEĞİL — LLM hatayı okuyup düzeltebilsin).
|
|
358
|
+
*/
|
|
359
|
+
declare function guarded<TArgs>(scope: ApiKeyScope, name: McpToolName, handler: (args: TArgs) => Promise<unknown>): (args: TArgs) => Promise<ToolTextResult>;
|
|
360
|
+
/** Girdi almayan araçlar için (`list_pipelines`) — aynı üç garanti, argümansız. */
|
|
361
|
+
declare function guardedNoArgs(scope: ApiKeyScope, name: McpToolName, handler: () => Promise<unknown>): () => Promise<ToolTextResult>;
|
|
362
|
+
//#endregion
|
|
363
|
+
//#region packages/mcp/dist/tools/ids.d.ts
|
|
364
|
+
/** `label` Türkçe okunur bir isimdir ("kişi", "şirket", "fırsat"...) */
|
|
365
|
+
declare function idField(label: string): z.ZodUUID;
|
|
366
|
+
//#endregion
|
|
367
|
+
//#region packages/mcp/dist/tools/notes.d.ts
|
|
368
|
+
declare function registerNoteTools(server: McpServer, client: McpSolicrmClient, scope: ApiKeyScope): Array<[McpToolName, RegisteredTool]>;
|
|
369
|
+
//#endregion
|
|
370
|
+
//#region packages/mcp/dist/tools/pipelines.d.ts
|
|
371
|
+
declare function registerPipelineTools(server: McpServer, client: McpSolicrmClient, scope: ApiKeyScope): Array<[McpToolName, RegisteredTool]>;
|
|
372
|
+
//#endregion
|
|
373
|
+
//#region packages/mcp/dist/tools/search.d.ts
|
|
374
|
+
declare const searchInputSchema: z.ZodObject<{
|
|
375
|
+
q: z.ZodString;
|
|
376
|
+
limit: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
|
|
377
|
+
resources: z.ZodOptional<z.ZodArray<z.ZodEnum<{
|
|
378
|
+
companies: "companies";
|
|
379
|
+
contacts: "contacts";
|
|
380
|
+
deals: "deals";
|
|
381
|
+
}>>>;
|
|
382
|
+
}, z.core.$strip>;
|
|
383
|
+
type SearchInput = z.infer<typeof searchInputSchema>;
|
|
384
|
+
declare function toSearchParams(args: SearchInput): SearchParams;
|
|
385
|
+
declare function registerSearchTools(server: McpServer, client: McpSolicrmClient, scope: ApiKeyScope): Array<[McpToolName, RegisteredTool]>;
|
|
386
|
+
//#endregion
|
|
387
|
+
//#region packages/mcp/dist/tools/tasks.d.ts
|
|
388
|
+
declare function registerTaskTools(server: McpServer, client: McpSolicrmClient, scope: ApiKeyScope): Array<[McpToolName, RegisteredTool]>;
|
|
389
|
+
//#endregion
|
|
390
|
+
//#region packages/mcp/dist/tools/views.d.ts
|
|
391
|
+
declare function registerSavedViewTools(server: McpServer, client: McpSolicrmClient, scope: ApiKeyScope): Array<[McpToolName, RegisteredTool]>;
|
|
392
|
+
//#endregion
|
|
393
|
+
//#region packages/mcp/dist/tools/index.d.ts
|
|
394
|
+
declare function registerAllTools(server: McpServer, client: McpSolicrmClient, scope: ApiKeyScope): Array<[McpToolName, RegisteredTool]>;
|
|
395
|
+
//#endregion
|
|
396
|
+
//#region packages/mcp/dist/transports/stdio.d.ts
|
|
397
|
+
declare function connectStdioTransport(server: McpServer): Promise<StdioServerTransport>;
|
|
398
|
+
//#endregion
|
|
399
|
+
export { API_KEY_SCOPES, type ApiKeyScope, BROWSER_ORIGIN_REJECTED_MESSAGE, type CliArgs, type CrmListInput, DEFAULT_HTTP_HOST, DEFAULT_HTTP_PORT, DEFAULT_MCP_SCOPE, MCP_HTTP_PATH, MCP_PROMPT_NAMES, MCP_RESOURCE_NAMES, MCP_TOOL_NAMES, type McpConfig, type McpEnv, type McpHttpHandlerDeps, McpInputError, type McpResourceName, McpScopeError, type McpSolicrmClient, type McpToolName, type McpTransportKind, RESOURCE_MIN_SCOPE, type RunCliDeps, type RunningMcpHttpServer, SCOPE_RANK, SDK_ERROR_NAMES, SOLICRM_MCP_SERVER_NAME, SOLICRM_MCP_VERSION, SolicrmMcpError, TOOL_MIN_SCOPE, type ToolTextResult, UNEXPECTED_ERROR_MESSAGE, USAGE, apiKeyScopeSchema, assertApiErrorShape, assertScope, assertSdkErrorNames, assertSolicrmClientSatisfiesMcpSurface, buildCrmListInputSchema, connectStdioTransport, createMcpHttpHandler, createSolicrmMcpServer, describeCrmListFields, firstVariable, guarded, guardedNoArgs, hasBrowserOrigin, idField, jsonResult, loadConfigFromEnv, parseCliArgs, parsePort, registerActivityTools, registerAllTools, registerCompanyTools, registerContactTools, registerCrmResources, registerDealTools, registerNoteTools, registerPipelineTools, registerSavedViewTools, registerSearchTools, registerSummarizePipelinePrompt, registerTaskTools, runCli, scopeSatisfies, startMcpHttpServer, toActivityListQuery, toCrmListQuery, toMcpToolError, toSearchParams };
|