tecof-mcp

tecof-mcp

MCP server for the Tecof Developer API that reads theme components from disk, converts agent-written sections into editor documents, and manages draft pages (create, update, delete, preview) with validation and multi-language support.

Category
访问服务器

README

@tecof/mcp

Tecof Developer API v1 için stdio MCP sunucusu. Bir Tecof tema reposunun içinden çalışır; tema bileşenlerini diskten (AST) okur, ajanın yazdığı basit "bölüm" tanımlarını editör dokümanına çevirir ve Developer API ile taslak sayfa oluşturur/günceller. Yayınlama her zaman panelden yapılır (API'de publish yok).

  • SDK: @modelcontextprotocol/server@^2 (+ zod@^4) — McpServer + serveStdio
  • Node ≥ 20, ESM
  • Tool annotations (readOnlyHint, destructiveHint) ve _meta["anthropic/requiresUserInteraction"] (silme) destekli

Kurulum

Tema reposunun kökünde:

# 1) Panelden API anahtarı üretin: Ayarlar → Geliştirici / API Anahtarları (scope: pages:read, pages:write)
# 2) .env (gitignore'da) içine yazın
echo 'TECOF_API_TOKEN=tcf_...' >> .env

Sunucu npx ile çalışır; global kurulum gerekmez:

npx -y @tecof/mcp@latest

Ortam değişkenleri

TECOF_PROJECT_DIR → CLAUDE_PROJECT_DIR → process.cwd() sırasıyla proje dizini bulunur; .env ve .env.local buradan okunur. process.env ezilmez — dosya değerleri yalnız boş olan anahtarları doldurur (.env.local > .env).

Değişken Zorunlu Açıklama
TECOF_API_TOKEN evet tcf_… kişisel erişim anahtarı
TECOF_API_URL evet* Backend adresi; yoksa NEXT_PUBLIC_BASE_URL kullanılır
TECOF_THEME_ID hayır Global tema id; yoksa NEXT_PUBLIC_THEME_ID, o da yoksa mağazanın aktif teması
TECOF_LOCAL_URL hayır Yerel önizleme kökü (varsayılan http://localhost:3000)
TECOF_PROJECT_DIR hayır Tema reposu başka dizindeyse

Eksik token/URL durumunda sunucu yine başlar; list_components ve validate_document çalışır, sayfa araçları yol gösteren bir hata döner. Loglar yalnız stderr'e yazılır; yakalanmamış hatalar da stderr'e düşer, süreç çökmez.

Güvenlik: TECOF_API_URL https olmalı. http:// (loopback dışı) bir adres verilirse başlangıçta stderr uyarısı basılır ve her tool hatasına aynı ipucu eklenir; http→https yönlendirmeleri takip edilmez (Node fetch yönlendirmede Authorization'ı düşürür, yanıltıcı 401 çıkardı) — 3xx yanıtı "TECOF_API_URL şeması/host'u yanlış" hatasına çevrilir. İstek zaman aşımı (30 sn) header + gövde okumasının tamamını kapsar.

Claude Code — .mcp.json

{
  "mcpServers": {
    "tecof": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "${TECOF_MCP_PACKAGE:-@tecof/mcp@latest}"]
    }
  }
}

TECOF_MCP_PACKAGE env'i paket spec'ini ezer — npm'e yayınlanmadan önce ya da yerel geliştirme için bu repo klasörünü verin (npx -y /path/to/tecof-mcp klasördeki bin'i çalıştırır):

export TECOF_MCP_PACKAGE=/Users/<siz>/Desktop/Tecof/tecof-mcp   # claude'u bu shell'den başlatın

Yayınlama (npm)

npm run build && npm test && node scripts/smoke.mjs
npm version patch            # ya da minor
npm publish --access public  # @tecof kapsamı — tecof-theme-editor/analytics ile aynı hesap

Codex — .codex/config.toml

[mcp_servers.tecof]
command = "npx"
args = ["-y", "@tecof/mcp@latest"]

Gemini CLI — .gemini/settings.json

{
  "mcpServers": {
    "tecof": {
      "command": "npx",
      "args": ["-y", "@tecof/mcp@latest"]
    }
  }
}

Token hiçbir yapılandırma dosyasına yazılmaz; .env içinde kalır. İstemci süreci tema reposunun kökünde başlatır, sunucu .env'i oradan okur.

Araçlar

Tool Girdi Ne yapar
get_site_context — Mağaza, diller, tema (themeId/merchantThemeId/domain), token scope/bitiş, sayfa sayısı
list_components category?, component?, detail?: summary|full Tema kataloğu (diskten AST, mtime cache). full: alanlar, seçenekler, slot allow, defaultProps, variants
list_pages includeTemplates? Sayfa listesi (slug artan)
get_page page (id|slug), mode?: outline|full outline: bölüm/slot ağacı (id, type, kısa metin); full: draftData
validate_document { sections } veya { document } Kaydetmeden doğrular; ok, errors, warnings, normalizedDocument
create_page slug, title, sections, meta?, layoutFrom?, dryRun? Taslak oluşturur; Header/Footer layoutFrom sayfasındaki (varsayılan home) ortak bileşenlerden kopyalanır
update_page page, operations veya document, meta?, dryRun? GET → işlemleri uygula → doğrula → PUT (expectedModifiedDate ile iyimser kilit; 409'da net mesaj)
delete_page page, confirm: true Soft delete — kullanıcı onayı şart
get_preview_url page, locale? 1 saatlik taslak önizleme linkleri (storefront + yerel)

Sonuçlar content[0].text (JSON) + structuredContent olarak döner; hatalar isError: true ile alan/yol bilgisi taşır (ajan düzeltebilsin diye).

update_page operation'ları

append_section{section} (Footer'ın önüne), insert_section{section, before?|after?} (anchor yoksa append gibi Footer'ın önüne), replace_section{id, section}, remove_section{id}, move_section{id, before?|after?}, set_props{id, props} (sığ birleşim), set_slot{id, slot, children} (slotu komple değiştirir; önce yeni çocuklar inşa edilir, başarısızsa eski içerik korunur), set_root_props{props}.

Davranış notları:

  • Ortak bileşenler salt-okunur — alt düğümleri dahil. sharedComponentId taşıyan düğüm (Header/Footer) ve onun zones altındaki tüm torunları (Logo, NavLink, FooterColumn…) set_props/set_slot/replace_section/remove_section ile değiştirilemez; "ortak bileşen — panel editöründen düzenleyin" hatası döner. Ortak kökün kendisi remove_section ile sayfadan kaldırılabilir (uyarıyla; master etkilenmez). get_page outline'ında bu düğümler shared: true ile işaretlidir.
  • Hata / uyarı ayrımı (operations modu): GET'ten gelen doküman önce normalize edilir (props'ta kalmış inline slot dizileri → zones; master'ı silinmiş SharedComponentRef düğümleri uyarıyla düşer — backend PUT'ta aynısını yapar). Ajanın bu turda eklediği/değiştirdiği düğümler katı denetlenir (bilinmeyen type, allow ihlali, element-at-root → hata); önceden var olan, dokunulmayan düğümlerdeki ihlaller yalnız uyarıdır — tema değişmiş diye ilgisiz bir güncelleme kilitlenmez. document modunda ve create_page/validate_document'ta tüm düğümler katı denetlenir.
  • Boş operations: [] (meta da yoksa) → "uygulanacak işlem yok" hatası; PUT atılmaz. Yalnız meta verilirse draftData gönderilmez (status published→changed olmaz, gereksiz revizyon açılmaz); yanıtta savedDraft alanı bunu gösterir.
  • Backend'in kaydetme uyarıları (zarf kökündeki warnings: [{code,path,message}], örn. master'ı silinmiş Header bağının düşürülmesi) create_page/update_page yanıtında sunucu: [code] path: message satırları olarak döner.

Yazarlık biçimi

Ajan doküman JSON'u değil, bölüm ağacı yazar; id üretimi, defaultProps birleşimi, slot → zone dönüşümü ve çok dilli kısayollar sunucuda yapılır.

{
  "type": "FeaturesSection",
  "props": { "columns": "3", "background": "dark" },
  "variant": "dark",                       // bileşenin variants anahtarı (varsa)
  "slots": {
    "contentSlot": [
      { "type": "Title", "props": { "text": { "tr": "Neden biz?", "en": "Why us?" }, "size": "lg" } }
    ],
    "itemsSlot": [
      { "type": "Card", "props": { "href": "/hakkimizda" },
        "slots": { "contentSlot": [ { "type": "Paragraph", "props": { "text": "<p>Hızlı teslimat</p>" } } ] } }
    ]
  }
}

Dönüşüm kuralları:

  1. type katalogda yoksa hata; kökte element kategorisi hata; slot çocuğu allow dışında hata.
  2. props = defaultProps (−id, −inline slot çocukları) ← variants[variant].props (+_variant) ← kullanıcı props.
  3. slots[slot] verildiyse o; verilmediyse defaultProps'taki örnek çocuklar; [] verilirse boş. Hepsi zones["<id>:<slot>"]'a yazılır, props[slot] = [].
  4. Çok dilli kısayollar: "metin" → [{code: varsayılanDil, value}]; {tr, en} → [{code,value}]; eksik dil uyarı. link: "/yol" → [{code, value:{url, target:"_self"}}]. upload: URL string → dış dosya kaydı.
  5. select/radio değeri options dışındaysa hata. _ önekli anahtarlar hata (className serbest).
  6. id: 8 karakter [A-Za-z0-9_-], doküman genelinde tekil (geçerli+tekil bir props.id verilirse kabul edilir).

Geliştirme

npm install
npm run build        # tsc → dist/ (+ dist/bin.js +x)
npm test             # vitest (parser, build, validate, operations, api mock, config, uçtan uca MCP)
node scripts/smoke.mjs   # dist/bin.js'i stdio ile ayağa kaldırıp initialize + tools/list doğrular

Testler gerçek backend'e istek atmaz (fetch mock'u); tema kataloğu test/fixtures/theme altındaki kopya bileşenlerden okunur.

Programatik kullanım (HTTP transport vb.):

import { buildServer, ServerContext, loadConfig } from "@tecof/mcp";
const ctx = new ServerContext({ config: loadConfig() });
const server = buildServer({ ctx }); // McpServer — istediğiniz transport'a bağlayın

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选