systa-mcp 1.5.0 → 1.5.1

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.
Files changed (3) hide show
  1. package/SKILL.md +3 -3
  2. package/package.json +1 -1
  3. package/server.js +12 -7
package/SKILL.md CHANGED
@@ -1,5 +1,5 @@
1
1
  ---
2
- version: 1.5.0
2
+ version: 1.5.1
3
3
  name: systa
4
4
  description: |
5
5
  Drive SysTa (Talep Takip Sistemi / SysTa) — a
@@ -79,7 +79,7 @@ Short shared vocabulary. Use these words with the user; never expose raw REST pa
79
79
  | --------------------- | ------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- |
80
80
  | Talep | Request / ticket | Core unit of work. Has `title` (min 5), `companyId`, `statusId`, priority, category, assignee, comments, files, relations. Çoğu iş bir talebin etrafında döner. |
81
81
  | Durum | Status | Lifecycle state (Açık/Open, Devam Ediyor/In Progress, Tamamlandı/Done). `is_final` durumlar kapanışı temsil eder. Resolved via `GET /api/statuses`. |
82
- | Öncelik | Priority | normal / high / critical. Belirtilmezse `normal`. |
82
+ | Öncelik | Priority | low / normal / high / urgent / critical. Belirtilmezse `normal`. |
83
83
  | Kategori | Category | Talep sınıflandırması (catalog/config). |
84
84
  | Yorum | Comment | Talebe eklenen not/yorum (`commentText` plain string ok). |
85
85
  | Atama | Assignment | `assignedTo` = bir kullanıcı. "bana/üzerime" → mevcut `userId`. |
@@ -209,7 +209,7 @@ Each maps a P0 user verb to a tool/endpoint, with the opinionated defaults from
209
209
 
210
210
  ### Üzerimdeki işler / talepleri listele (what's on my plate) — `list_requests` → `GET /api/requests`
211
211
 
212
- - "taleplerim / on me" → `assignedTo=<my userId>`. "açık/open" → `openOnly:true`. "geciken/overdue" → `overdue:true` (deadline geçmiş + non-final auto-composed) veya `slaBreached:true` (SLA ihlali). "SLA durumu" → `slaStatus:['breached','active']`. **"dosyalı talepler / eki olan" → `hasAttachments:true`** (top-level talep eki). Deadline'a göre → `deadlineFrom`/`deadlineTo` (YYYY-MM-DD) ya da `deadlineWithinDays:N` (önümüzdeki N gün). Search kapsamını genişlet: `searchIn:['assignee','creator','comments',...]`. **Response boyutu:** `fields` varsayılan `'summary'` (satır başına ~1KB); `'detail'` (description/effort/counts eklenir) veya `'full'` (customFields/stakeHolders dahil, çok büyük). Default `limit=20-50`, sort `created_at desc`. Yanıt zarfı: `{items, total, limit, offset}` — sayfa sayısı `= ceil(total/limit)`. Summarize as a short list (numara + başlık + durum), not raw rows.
212
+ - "taleplerim / on me" → `assignedTo=<my userId>`. "açık/open" → `openOnly:true`. "geciken/overdue" → `overdue:true` (deadline geçmiş + non-final auto-composed) veya `slaBreached:true` (SLA ihlali). "SLA durumu" → `slaStatus:['breached','active']`. **"dosyalı talepler / eki olan" → `hasAttachments:true`** (top-level talep eki). Deadline'a göre → `deadlineFrom`/`deadlineTo` (YYYY-MM-DD) ya da `deadlineWithinDays:N` (önümüzdeki N gün). **`overdue` ile `deadlineWithinDays` birlikte kullanılmaz** — ikisi aynı arka uç parametresine yazar, birlikte verilirse `overdue` kazanır ve diğeri sessizce yok sayılır (zaten ters soruları sorarlar: geçmiş vs. yaklaşan). Search kapsamını genişlet: `searchIn:['assignee','creator','comments',...]`. **Response boyutu:** `fields` varsayılan `'summary'` (satır başına ~1KB); `'detail'` (description/effort/counts eklenir) veya `'full'` (customFields/stakeHolders dahil, çok büyük). Default `limit=20-50`, sort `created_at desc`. Yanıt zarfı: `data.requests[]` + `data.pagination{total, limit, offset, page, totalPages}` — dizinin anahtarı `requests`'tir (`items` DEĞİL) ve ikisi de `data` altındadır. Summarize as a short list (numara + başlık + durum), not raw rows.
213
213
 
214
214
  ### Talep detayı (show a request) — `get_request` → `GET /api/requests/:requestNumber`
215
215
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "systa-mcp",
3
- "version": "1.5.0",
3
+ "version": "1.5.1",
4
4
  "description": "MCP stdio server for SysTa (Talep Takip Sistemi) — lets AI agents (Claude, Codex) use the SysTa REST API via a scoped API key. Zero npm dependencies (native Node).",
5
5
  "type": "commonjs",
6
6
  "main": "server.js",
package/server.js CHANGED
@@ -44,7 +44,7 @@ const INSTRUCTIONS = [
44
44
  'cagri yine de sunucu tarafinda 403 doner. Bir isi yapmadan ONCE:',
45
45
  ' 1) `list_capabilities` cagir — anahtarin erisebildigi modul/endpoint katalogunu',
46
46
  ' (scope-filtreli) gorursun. GENIS/WILDCARD anahtarda ONCE `list_capabilities({summary:true})`',
47
- ' cagir (oryantasyon + modul indeksi, birkac KB; tam katalog yuzlerce KB olabilir), sonra',
47
+ ' cagir (oryantasyon + modul indeksi, ~57 KB; compact katalog ~483 KB, projeksiyonsuz cagri megabaytlara cikar), sonra',
48
48
  ' ilgili modul icin `list_capabilities({module:"<ad>"})` ile derinles. Yetkisiz endpoint listede GORUNMEZ. Yanit AYRICA SysTa',
49
49
  ' platform OZETI (overview), TR GLOSSARY, her modulun ACIKLAMASINI (description/concepts)',
50
50
  ' ve SENIN kullanicini (user) icerir — "ben / bana ata / uzerimdeki" niyetinde assignedTo',
@@ -757,8 +757,9 @@ const shapeCompact = (caps) => ({
757
757
  /**
758
758
  * Index-only view: orientation (overview/glossary/user) + module names with
759
759
  * endpoint COUNTS, but NO per-endpoint detail. For a wildcard '*' key the full
760
- * compact catalog is ~250KB (26 modules / 698 endpoints) which overflows agent
761
- * buffers; this summary is a few KB. Drill into one module with module='x'.
760
+ * compact catalog is ~483KB (69 modules / 1663 endpoint-methods, olculdu 2026-08-30)
761
+ * which overflows agent buffers; this summary is ~57KB. Drill into one module with
762
+ * module='x' (~54KB) or straight to describe_endpoint (~22KB).
762
763
  */
763
764
  const shapeSummary = (caps) => ({
764
765
  sessionType: caps.sessionType,
@@ -1093,7 +1094,7 @@ const MODULE_GATE_NOTE =
1093
1094
  const TOOLS = [
1094
1095
  {
1095
1096
  name: 'list_requests',
1096
- description: `List/search SysTa requests (talepler) with pagination and rich filters: status, assignee, company, category, department, priority, free-text, OVERDUE / SLA / DEADLINE. Common intents: 'uzerimdeki acik isler / my open work' => assignedTo=<me> + openOnly:true (excludes final statuses). 'geciken isler / overdue' => overdue:true (deadline gecmis + non-final) OR slaBreached:true (SLA ihlali). 'bu ay kapatilan' => finalOnly:true + completedFrom/completedTo (NOT YET SUPPORTED — use systa_api_call). search covers title/requestNumber/description/externalRef by default (NOT assignee/creator); use searchIn to expand. Multiple statuses: statusId can be an array [1,3,5]. Returns only requests the API key scope permits. Response envelope: {items:[], total, limit, offset} — totalPages = ceil(total/limit). RESPONSE SIZE: fields controls how much each row carries -- default 'summary' returns lightweight rows (~1KB each: id, requestNumber, title, statusName, priority, assignedTo, deadline, isOverdue, slaStatus, commentCount, fileCount). Use fields:'detail' when you need description/effort/counts, or fields:'full' for everything incl. customFields/stakeHolders (LARGE — S-A2 kanit: 44 talep tam moduyla ~300KB).${MASKING_NOTE}${EMPTY_SCOPE_NOTE}`,
1097
+ description: `List/search SysTa requests (talepler) with pagination and rich filters: status, assignee, company, category, department, priority, free-text, OVERDUE / SLA / DEADLINE. Common intents: 'uzerimdeki acik isler / my open work' => assignedTo=<me> + openOnly:true (excludes final statuses). 'geciken isler / overdue' => overdue:true (deadline gecmis + non-final) OR slaBreached:true (SLA ihlali). 'bu ay kapatilan' => finalOnly:true + completedFrom/completedTo (NOT YET SUPPORTED — use systa_api_call). search covers title/requestNumber/description/externalRef by default (NOT assignee/creator); use searchIn to expand. Multiple statuses: statusId can be an array [1,3,5]. Returns only requests the API key scope permits. Response envelope: data.requests[] + data.pagination{total,limit,offset,page,totalPages} — the array key is 'requests' (NOT 'items') and both live under 'data'. Verified against the endpoint Response Contract v2 (required: [requests, pagination]). RESPONSE SIZE: fields controls how much each row carries -- default 'summary' returns lightweight rows (~1KB each: id, requestNumber, title, statusName, priority, assignedTo, deadline, isOverdue, slaStatus, commentCount, fileCount). Use fields:'detail' when you need description/effort/counts, or fields:'full' for everything incl. customFields/stakeHolders (LARGE — S-A2 kanit: 44 talep tam moduyla ~300KB).${MASKING_NOTE}${EMPTY_SCOPE_NOTE}`,
1097
1098
  inputSchema: {
1098
1099
  type: 'object',
1099
1100
  additionalProperties: false,
@@ -1161,7 +1162,8 @@ const TOOLS = [
1161
1162
  overdue: {
1162
1163
  type: 'boolean',
1163
1164
  description:
1164
- 'true => geciken/overdue: deadline in the past AND not in a final status. Shorthand for deadlineDaysRemaining[operator]=lt&deadlineDaysRemaining[value]=0 combined with openOnly.',
1165
+ 'true => geciken/overdue: deadline in the past AND not in a final status. Shorthand for deadlineDaysRemaining[operator]=lt&deadlineDaysRemaining[value]=0 combined with openOnly. ' +
1166
+ 'MUTUALLY EXCLUSIVE with deadlineWithinDays (same backend parameter pair); when both are set, overdue WINS.',
1165
1167
  },
1166
1168
  slaStatus: {
1167
1169
  type: 'array',
@@ -1188,7 +1190,10 @@ const TOOLS = [
1188
1190
  deadlineWithinDays: {
1189
1191
  type: 'integer',
1190
1192
  description:
1191
- 'Deadline within N days from now (i.e. deadlineDaysRemaining[operator]=lte,value=N).',
1193
+ 'Deadline within N days from now (i.e. deadlineDaysRemaining[operator]=lte,value=N). ' +
1194
+ 'MUTUALLY EXCLUSIVE with overdue: both map to the same backend parameter pair, so ' +
1195
+ 'if overdue is also set this one is IGNORED. Pick one — they ask opposite questions ' +
1196
+ '(already late vs. due soon).',
1192
1197
  },
1193
1198
  fields: {
1194
1199
  type: 'string',
@@ -3460,7 +3465,7 @@ The number is the request number for "#", and the card's GLOBAL id for "##" (NOT
3460
3465
  'shown), each with its HTTP methods, safety class (read_only/idempotent/mutating/' +
3461
3466
  'destructive) and required permission. Also returns SysTa overview, TR glossary and your ' +
3462
3467
  'user (who-am-i). Call this FIRST. For a broad key the full catalog can be large: pass ' +
3463
- 'summary=true to get only orientation + module names with endpoint counts (a few KB), then ' +
3468
+ 'summary=true to get only orientation + module names with endpoint counts (~57KB vs ~483KB compact), then ' +
3464
3469
  `pass module="<name>" to drill into one module. No args = full compact catalog.${MODULE_GATE_NOTE}`,
3465
3470
  inputSchema: {
3466
3471
  type: 'object',