kuroco-mng-api-browser
npx skills add https://github.com/diverta/kuroco-skills --skill kuroco-mng-api-browser
Agent 安装分布
Skill 文档
Kuroco mng_api Browser Skill
æ¦è¦
Kurocoã®ç®¡çAPIï¼mng_apiï¼ãclaude-in-chrome MCPãã¼ã«çµç±ã§æä½ããã¹ãã«ã
mng_apiã®5ã¤ã®ã¢ã¼ã:
- whoami: ã»ãã·ã§ã³æ å ±ã®åå¾ï¼GETï¼ â member_id, name, group_ids, expiresAt ãè¿ã
- discover: å©ç¨å¯è½ãªã¢ã¸ã¥ã¼ã«ã»ã³ã³ããã¼ã©ã®æ¢ç´¢ï¼GETï¼
- schema: ã³ã³ããã¼ã©/ãµã¼ãã¹ã®ãªã¯ã¨ã¹ãã»ã¬ã¹ãã³ã¹ã¹ãã¼ãåå¾ï¼GETï¼
- advise: èªç¶è¨èªã§ãããããã¨ãä¼ããã¨ãå¼ã¶ã¹ãAPIã¨æé ãAIãåçï¼POSTï¼
- execute: APIã®å®è¡ï¼GET/POSTï¼ â
columnsãã©ã¡ã¼ã¿ã§ã¬ã¹ãã³ã¹ã«ã©ã 鏿å¯è½
èªè¨¼æ¹å¼: ãã©ã¦ã¶ã®ã»ãã·ã§ã³Cookieï¼__Host-rcms_api_access_tokenãHttpOnlyï¼ãå©ç¨ãjavascript_toolã§fetch()ãå®è¡ããã°ãCookieãèªåéä¿¡ããããããã¼ã¯ã³ã®æ½åºã¯ä¸è¦ã
åææ¡ä»¶:
- claude-in-chrome MCPãå©ç¨å¯è½ï¼æªè¨å®ã®å ´åã¯ä¸è¨ãæä½ããã¼ãStep 0 ã§æ¡å ï¼
- ã¦ã¼ã¶ã¼ãKuroco管çç»é¢ï¼
https://*.*.kuroco-mng.appï¼ã«ãã°ã¤ã³æ¸ã¿ - 対象ãµã¤ãã䏿ãªå ´åã¯ããµã¤ããã¼ã¾ãã¯ç®¡çç»é¢URLãã¦ã¼ã¶ã¼ã«ç¢ºèªãã¦ç¹å®ãã
- ãã¹ã¦ã®æä½ã¯ãã°ã¤ã³ä¸ã¦ã¼ã¶ã¼ã®æ¨©éã§å®è¡ããã
æå°æä½ããã¼ï¼èªã¿åã: 4-5åãæ¸ãè¾¼ã¿: 5-6åã® tool callï¼:
javascript_tool: èªè¨¼ãã§ãã¯ï¼MODE=whoamiï¼navigate+get_page_text:/llms.txtã§ã¢ã¸ã¥ã¼ã«/ã³ã³ããã¼ã©ç¹å®navigate+get_page_text:/direct/rcms_api/llms/?mt={module}ã§ãã£ã¼ã«ãåã»ãã©ã¡ã¼ã¿ä»æ§ãåå¾- ï¼æ¸ãè¾¼ã¿æï¼
javascript_tool: MODE=schema ã§ãã£ã¼ã«ãåã»å¿ é é ç®ã»ãããã¯ã¨ãã£ã¿æ§é ãåå¾javascript_tool: APIå®è¡ï¼mt/ctå½¢å¼ï¼Step 3 ã¯å¿ é ã
/llms.txtï¼æ¦è¦ï¼ã«ã¯ã¢ã¸ã¥ã¼ã«ä¸è¦§ãããªããext_colã®ãã£ã¼ã«ãåã¯å«ã¾ããªãããã£ã¼ã«ãåã®ææ¡ã«ã¯ã¢ã¸ã¥ã¼ã«è©³ç´°ãå¿ è¦ã Step 4 ã¯æ¸ãè¾¼ã¿æä½ã§å¿ é ã ã¹ãã¼ãã¯data.request.propertiesã«JSON Schemaå½¢å¼ã§ãã£ã¼ã«ãå®ç¾©ãè¿ããtopics_group_idãæå®ãããã¨ã§ext_col/ãããã¯ã¨ãã£ã¿ã®å¿ é ãã£ã¼ã«ãã夿ããã discoverã¢ã¼ãã¯é常ä¸è¦ãllms.txtã®2段éï¼æ¦è¦â詳細ï¼ã§ååãªæ å ±ãå¾ãããã
æä½ããã¼
ãã¹ã¦ã®APIæä½ã¯ãã®ããã¼ã«å¾ããã¨ã
æä½éå§åã®å¤æ: ã¦ã¼ã¶ã¼ããããã確èªãã¦ããããæ¤ç´¢ãã¦ãããã®ãã¼ã¿ãè¦ã¦ãçã®ãªã¯ã¨ã¹ããåããå ´åãã¾ãããã**ãã¼ã¿åå¾ï¼APIï¼**ã§è§£æ±ºã§ããã夿ããã管çç»é¢ã®UIãç®ã®åã«ãã£ã¦ããåå°çã«ã¯ãªãã¯æä½ã«å ¥ããªããã¨ãAPIã§åå¾ã§ãããã¼ã¿ã¯APIã§åå¾ãããUIãã©ã¦ã¶æä½ã¯APIã§ã¯ä¸å¯è½ãªæä½ï¼ãã¡ã¤ã«ã¢ãããã¼ãããã¬ãã¥ã¼ãGUIåºæã®è¨å®å¤æ´çï¼ã«ã®ã¿ä½¿ç¨ããã
Step 0: claude-in-chrome MCP ã®ç¢ºèª
ãã®ã¹ãã«ã¯ mcp__claude-in-chrome__* ãã¼ã«ç¾¤ã«ä¾åãããæä½éå§åã«ããããã®ãã¼ã«ãå©ç¨å¯è½ã確èªããã
ç¢ºèªæ¹æ³: mcp__claude-in-chrome__tabs_context_mcp ãå¼ã³åºãã
- æåããå ´å â Step 1 ã¸é²ã
- ãã¼ã«ãè¦ã¤ãããªã / æ¥ç¶ã¨ã©ã¼ã®å ´å â ã¦ã¼ã¶ã¼ã«ã»ããã¢ãããæ¡å ãã:
ãã©ã¦ã¶æä½ã«å¿
è¦ãª claude-in-chrome MCP ãå©ç¨ã§ãã¾ããã
以ä¸ã®æé ã§ã»ããã¢ãããã¦ãã ããã
ãå¿
è¦ãªãã®ã
1. Google Chrome ã¾ã㯠Microsoft Edge
2. Claude in Chrome æ¡å¼µæ©è½ï¼v1.0.36以ä¸ï¼
â Chrome Web Store ããã¤ã³ã¹ãã¼ã«:
https://chromewebstore.google.com/detail/claude/fcoeoabgfenejglbffodgkkbkcdhcgfn
3. Claude Code v2.0.73 以ä¸
ãæå¹åã®æé ã
- Claude Code ã»ãã·ã§ã³å
ã§ `/chrome` ãå®è¡
- ã¾ã㯠`claude --chrome` ã§èµ·å
ã»ããã¢ããå®äºå¾ãããä¸åº¦ã試ããã ããã
注æ: Chrome飿ºã¯ Anthropic ã®ç´æ¥ãã©ã³ï¼Pro, Max, Teams, Enterpriseï¼ãå¿ è¦ã§ãããµã¼ããã¼ãã£ãããã¤ãï¼Amazon Bedrock, Google Cloud Vertex AI çï¼çµç±ã§ã¯å©ç¨ã§ãã¾ããã
Step 1: 対象ãµã¤ãã®ç¹å®
mcp__claude-in-chrome__tabs_context_mcpãå¼ã³åºããURLãã¿ã¼ã³ *.*.kuroco-mng.app ã«ä¸è´ããã¿ããæ¢ãã
- ã¿ãã1ã¤è¦ã¤ãã£ãå ´å â ãã®ã¿ãã®URLãããã¼ã¹URLï¼
https://{site_key}.{env}.kuroco-mng.appï¼ãåå¾ãã以éã®æä½ã§ä½¿ç¨ - è¤æ°ã®Kurocoã¿ããè¦ã¤ãã£ãå ´å â ã©ã®ãµã¤ããæä½ãããã¦ã¼ã¶ã¼ã«ç¢ºèª
- ã¿ããè¦ã¤ãããªãå ´å â
AskUserQuestionãã¼ã«ã§ãµã¤ããã¼ã¾ãã¯ç®¡çç»é¢URLã確èªï¼
{
"questions": [{
"question": "æä½å¯¾è±¡ã®Kuroco管çç»é¢ãç¹å®ã§ãã¾ããã§ããããµã¤ããã¼ã¾ãã¯ç®¡çç»é¢URLãæãã¦ãã ããï¼ä¾: demo / https://demo.g.kuroco-mng.app/management/ / https://demo.stg.kuroco-mng.app/management/ï¼",
"header": "対象ãµã¤ã",
"options": [
{ "label": "URLãå
¥åãã", "description": "管çç»é¢ã®URLï¼https://***.*.kuroco-mng.app/management/ï¼ãå
¥å" },
{ "label": "ãµã¤ããã¼ãå
¥åãã", "description": "ãµã¤ããã¼ï¼ä¾: demoï¼ãå
¥åãç°å¢ã¯ã¿ãã®URLã¾ãã¯ã¦ã¼ã¶ã¼ã«ç¢ºèª" }
],
"multiSelect": false
}]
}
ã¦ã¼ã¶ã¼ã®åçãããã¼ã¹URLãç¹å®ããmcp__claude-in-chrome__tabs_create_mcp ã§ç®¡çç»é¢ãéãï¼
- URLãæä¾ãããå ´å â URLãããã¹ãé¨åãæ½åºï¼ä¾:
https://demo.g.kuroco-mng.appï¼ - ãµã¤ããã¼ãæä¾ãããå ´å â
https://{site_key}.{env}.kuroco-mng.appãæ§ç¯ï¼envã¯ã¦ã¼ã¶ã¼ã«ç¢ºèªãããã©ã«ãã¯gï¼
注æ: ãã¹ã¦ã®æä½ã¯ãã©ã¦ã¶ã§ãã°ã¤ã³ä¸ã®ã¦ã¼ã¶ã¼ã®æ¨©éã§å®è¡ããã¾ãããã®ã¦ã¼ã¶ã¼ãã¢ã¯ã»ã¹æ¨©ãæããªãã¢ãã«ãã¡ã½ããã¯æä½ã§ãã¾ããã
Step 2: èªè¨¼ãã§ãã¯ï¼è»½éãªã¯ã¨ã¹ãï¼
mcp__claude-in-chrome__javascript_toolã§ä»¥ä¸ãå®è¡:
(async () => {
const r = await fetch('/direct/rcms_api/mng_api/?MODE=whoami', {credentials:'include'});
const d = await r.json();
return JSON.stringify({status: r.status, ok: r.ok, member_id: d.member_id, name: (d.name2 || '') + ' ' + (d.name1 || ''), group_ids: d.group_ids});
})()
éè¦:
javascript_toolã§ã¯ãããã¬ãã«awaitã¯ä½¿ããªãã ãã¼ã¸ã³ã³ããã¹ãã§ã®è©ä¾¡ã¨ãªããããawaitã使ãå ´åã¯å¿ ã(async () => { ... })()ã§ã©ãããããã¨ããããã¬ãã«ã§awaitãæ¸ãã¨SyntaxError: await is only valid in async functionsã«ãªãã
MODE=whoamiã¯ã»ãã·ã§ã³æ å ±ï¼member_id, name1, name2, group_ids, expiresAtï¼ãè¿ã軽éã¨ã³ããã¤ã³ããèªè¨¼ç¢ºèªã¨åæã«ãã°ã¤ã³ã¦ã¼ã¶ã¼ã®æ¨©éæ å ±ãåå¾ã§ããã
Step 3: llms.txt ã§ãµã¤ãæ§é ææ¡ï¼å¿ é ï¼
navigate + get_page_text ã§ llms.txt ãèªãã1åã®ãªã¯ã¨ã¹ãã§ä»¥ä¸ãå¾ããã:
- å ¨ã¢ã¸ã¥ã¼ã«ã»ã³ã³ããã¼ã©ä¸è¦§
- ã³ã³ãã³ãå®ç¾©ã»APIã»ãã©ã¼ã çã®ãµã¤ãããã
- mng_api ã®ä½¿ãæ¹ã»ãã©ã¡ã¼ã¿ä»æ§
- ã¯ã¼ã¯ããã¼ä¾
navigate â /llms.txt
get_page_text â ãµã¤ãå
¨ä½ã®æ§é ãåå¾
注æ:
- 管çç»é¢ãã¼ã¸å·¡åã®åã«å¿ ãllms.txtã確èªã大åã®æ§é æ å ±ã¯ããã§å¾ãããï¼discoverã¢ã¼ãé常ä¸è¦ï¼
- llms.txt ã¯Kurocoããã°ã¤ã³ã¦ã¼ã¶ã¼ã®æ¨©éã«åºã¥ãã¦åçã«çæãããã¦ã¼ã¶ã¼ã®æ¨©éå¤ã®APIã¯è¡¨ç¤ºãããªã
/llms.txtï¼æ¦è¦ï¼ã«ã¯ã¢ã¸ã¥ã¼ã«ä¸è¦§ã®ã¿ãext_colãã£ã¼ã«ãåã¯æ¬¡ã® Step 3.5 ã§åå¾
Step 3.5: ã¢ã¸ã¥ã¼ã«è©³ç´°ã§ãã£ã¼ã«ãåãææ¡ï¼å¿ é ï¼
æä½å¯¾è±¡ã®ã¢ã¸ã¥ã¼ã«ãç¹å®ã§ããããå¿ ãã¢ã¸ã¥ã¼ã«è©³ç´°ãèªãã§ãã£ã¼ã«ãåãææ¡ããã
navigate â /direct/rcms_api/llms/?mt={module}
get_page_text â ext_colã®ãã£ã¼ã«ãåãAvailable Columnsããã©ã¡ã¼ã¿ä»æ§ãåå¾
ãã®ã¹ããããçç¥ãã¦ã¯ãªããªãã ext_col_01ã20ã®ãã£ã¼ã«ãåï¼ä¾: ext_col_03 = to, ext_col_04 = ccï¼ã¯ã¢ã¸ã¥ã¼ã«è©³ç´°ã«ããè¨è¼ããã¦ããªãã管çç»é¢ã®DOMãå·¡åããããAPIã¬ã¹ãã³ã¹ã®ä¸èº«ãæ¨æ¸¬ããã®ã¯éå¹çã§ã¨ã©ã¼ã®åå ã«ãªãã
Step 4: ã¹ãã¼ãåå¾ï¼æ¸ãè¾¼ã¿æä½ã§ã¯å¿ é ï¼
æ¸ãè¾¼ã¿æä½ï¼INSERT/UPDATEï¼ãè¡ãå ´åã¯ãå¿ ãã¹ãã¼ããåå¾ãã¦ãã£ã¼ã«ãæ§é ã確èªãããã¨ã ç¹ã«ãããã¯ã¨ãã£ã¿ãæ¡å¼µé ç®ï¼ext_colï¼ãæã¤ã³ã³ãã³ãå®ç¾©ã§ã¯ãå¿ é ãã£ã¼ã«ãåãåãã¹ãã¼ãã§ããææ¡ã§ããªãã
éè¦: ã¹ãã¼ãã¬ã¹ãã³ã¹ã¯JSON Schemaå½¢å¼ã
data.requestç´ä¸ã«ã¯ãã£ã¼ã«ãæ å ±ã¯ãªããdata.request.propertiesã«ãã£ã¼ã«ãå®ç¾©ããdata.request.requiredã«å¿ é ãã£ã¼ã«ããæ ¼ç´ããã¦ããã
ã³ã³ãã³ãå®ç¾©åºæã®ãã£ã¼ã«ããåå¾ããã«ã¯ topics_group_id ãæå®ãã:
// javascript_tool â topics_group_idæå®ã§ext_colå«ããã£ã¼ã«ãä¸è¦§ãåå¾
(async () => {
const r = await fetch('/direct/rcms_api/mng_api/?MODE=schema&mt=topics&ct=topics_edit&topics_group_id=99', {credentials:'include'});
const data = await r.json();
const props = data.request?.properties || {};
const required = Array.isArray(data.request?.required) ? data.request.required : Object.keys(data.request?.required || {});
const fields = {};
Object.entries(props).forEach(([k, v]) => {
fields[k] = {type: v.type, description: v.description, kurocoType: v['x-kuroco-type'], required: required.includes(k)};
});
return JSON.stringify(fields, null, 2);
})();
注æ:
topics_group_idãçç¥ããã¨æ±ç¨ãã£ã¼ã«ãã®ã¿è¿ãï¼ext_col ãå«ã¾ããªãï¼topics_group_idãæå®ããã¨ãããã¯ã¨ãã£ã¿ã»æ¡å¼µé ç®ã®ãã£ã¼ã«ãåï¼ext_1,ext_14çï¼ãåãå¿ é ãã©ã°ãåå¾ã§ãã- listç³»ã³ã³ããã¼ã©ï¼
topics_listçï¼ã¯ã¹ãã¼ãã空ãè¿ããããæ¸ãè¾¼ã¿ç¨ã³ã³ããã¼ã©ï¼topics_editï¼ãæå®ãããã¨- ã¬ã¹ãã³ã¹ã®
x-kuroco-typeã§ãã£ã¼ã«ãã®ç¨®é¡ï¼wysiwyg,json,checkbox,fileçï¼ãããã
Step 5: APIå®è¡
èªè¨¼ç¢ºèªã»æ§é ææ¡ãå®äºããããAPIå®è¡ãã¿ã¼ã³ã«å¾ã£ã¦APIãå®è¡ããã
Step 6: èªè¨¼å¤±æã»ã»ãã·ã§ã³åã対å¿
401ã¾ãã¯403ãè¿ã£ãå ´å:
- ã¦ã¼ã¶ã¼ã«ãã°ã¤ã³ãå¿ è¦ãªæ¨ãä¼ãã
- ãã°ã¤ã³URL:
{base_url}/management/login/login/ï¼base_urlã¯ã¿ãã®URLããåå¾ï¼ - ã¦ã¼ã¶ã¼ããã°ã¤ã³ããã¾ã§å¾ æ©
- ãã°ã¤ã³å¾ã«å度èªè¨¼ãã§ãã¯
è¤æ°ã¹ãããã®æä½ä¸ã«401/403ãçºçããå ´å:
- å³åº§ã«æä½ã忢
- ã©ãã¾ã§æåããããã¦ã¼ã¶ã¼ã«å ±å
- åèªè¨¼ãæ¡å
- åèªè¨¼å¾ãæªå®äºã®æä½ããåé
ææ®µé¸æã®å¤æåºæºï¼æéè¦ï¼
åå: ãã¼ã¿ã®åå¾ã»æ¤ç´¢ã»ãã£ã«ã¿ãªã³ã°ãç®çãªããUIã§ã¯ãªãAPIã使ãã
ãã©ã¦ã¶ã§ç®¡çç»é¢ãéãã¦ãã¦ããUIè¦ç´ ãã¯ãªãã¯ãã¦æ
å ±ãæ¢ãã®ã¯äººéã®æä½æ¹æ³ã§ãããAIã¨ã¼ã¸ã§ã³ãã®æä½æ¹æ³ã§ã¯ãªãããã©ã¦ã¶ã®ã»ãã·ã§ã³Cookie㯠javascript_tool ã® fetch() ã§ãèªåéä¿¡ããããããUIããã²ã¼ã·ã§ã³ã¨APIå¼ã³åºãã®èªè¨¼ã³ã¹ãã¯åãã
| ç®ç | ææ®µ | çç± |
|---|---|---|
| ãã¼ã¿ä¸è¦§ã®åå¾ã»æ¤ç´¢ã»ãã£ã«ã¿ãªã³ã° | APIï¼mng_apiï¼ | æ§é åJSONãããã°ã©ã çã«å¦çå¯è½ |
| ç¹å®ã³ã³ãã³ãã®è©³ç´°ç¢ºèª | APIï¼mng_apiï¼ | columnsæå®ã§å¿ è¦é ç®ã ãåå¾å¯è½ |
| ãµã¤ãæ§é ã»API仿§ã®ææ¡ | llms.txt | 1åã§å ¨ä½ææ¡å¯è½ |
| ãã¡ã¤ã«ã¢ãããã¼ãã»ãã¬ãã¥ã¼ã»GUIåºæã®è¨å®å¤æ´ | UIãã©ã¦ã¶æä½ | APIã§ã¯ä¸å¯è½ãªæä½ã®ã¿ |
ã¢ã³ããã¿ã¼ã³
| ãããã¡ | åé¡ | æ¨å¥¨ |
|---|---|---|
| 管çç»é¢ã®UIè¦ç´ ãã¯ãªãã¯ãã¦ãã¼ã¿ãæ¤ç´¢ã»é²è¦§ãã | 人éã®æä½ã模å£ãã¦ããã ããé ããçµæãHTMLã§æ§é åããã¦ããªããæ¹åã»èªååã«ç¹ãããªã | mng_apiã®fetch()ã§JSONåå¾ãåãã»ãã·ã§ã³Cookieã使ããã®ã§UIãçµç±ããçç±ããªã |
columnsãæå®ããã«GETãªã¯ã¨ã¹ã |
ã¬ã¹ãã³ã¹ã巨大ã§ãããã¯ããã | 常ã«columns=å¿
è¦ã«ã©ã ãæå®ï¼å¹ããªãå ´åã¯.map()ã§æ½åºï¼ |
fetch() ã§HTMLãåå¾âDOMParserã§ãã¼ã¹ |
Vue.jsã¬ã³ããªã³ã°é¨åã空ã«ãªã | mng_api ã§JSONåå¾ |
document.querySelector('main').textContent ã§å
¨æåå¾ |
Cookieãããã¯ã®ãªã¹ã¯ | å¿ è¦ãªãã¼ã¿ã®ã¿æ½åº |
ãããã¬ãã« await ã使ã |
SyntaxError ã«ãªã |
å¿
ã (async () => { ... })() ã§ã©ãã |
| ã¡ã¼ã«ã¢ãã¬ã¹ãå«ããã£ã¼ã«ãå¤ããã®ã¾ã¾è¿ã | [BLOCKED] ã«ãªã |
.includes() ã§å¤å®çµæã®ã¿è¿ã |
Object.keys(data.request) ã§ã¹ãã¼ãã®ãã£ã¼ã«ããæ¢ã |
JSON Schemaå½¢å¼ãªã®ã§ type,properties,required ããè¿ããªã |
data.request.properties ã§ãã£ã¼ã«ãä¸è¦§ãåå¾ãã |
ã¹ãã¼ãåå¾æã« topics_group_id ãçç¥ãã |
æ±ç¨ãã£ã¼ã«ãã®ã¿ã§ext_colãå«ã¾ããªã | &topics_group_id={id} ãæå®ãã¦ã³ã³ãã³ãå®ç¾©åºæã®ãã£ã¼ã«ããåå¾ |
APIå®è¡ãã¿ã¼ã³
ãã©ã¡ã¼ã¿å½¢å¼
mng_apiã§ã¯ mtï¼ã¢ã¸ã¥ã¼ã«ï¼ã¨ ctï¼ã³ã³ããã¼ã©ï¼ã®å½¢å¼ã使ç¨ããã
| ãã©ã¡ã¼ã¿ | 説æ | ä¾ |
|---|---|---|
mt |
ã¢ã¸ã¥ã¼ã«åï¼å°æåï¼ | topics, member, inquiry |
ct |
ã³ã³ããã¼ã©å | topics_list, topics_edit, member_list |
注æ:
model=Topics&method=listå½¢å¼ã¯ä½¿ç¨ããªããã¨ãHTMLãè¿å´ãããå ´åããããå¿ ãmt/ctå½¢å¼ã使ç¨ããã
GETãªã¯ã¨ã¹ãï¼ä¸è¦§åå¾ã»æ¤ç´¢ï¼
// javascript_tool â columns + cnt ã§å¿
è¦æå°éã®ã¬ã¹ãã³ã¹ãåå¾
(async () => {
const r = await fetch('/direct/rcms_api/mng_api/?mt=topics&ct=topics_list&topics_group_id[]=1&cnt=10&columns=topics_id,subject,ymd', {credentials:'include'});
const data = await r.json();
return JSON.stringify(data, null, 2);
// â columns対å¿ã¨ã³ããã¤ã³ãã§ã¯ãµã¼ãã¼å´ãã£ã«ã¿ï¼åã¢ã¤ãã {topics_id, subject, ymd} ã®ã¿ï¼
// â é対å¿ã®å ´å㯠.map() ã§ã¯ã©ã¤ã¢ã³ãå´æ½åº:
// data.topics_list?.map(t => ({id: t.topics_id, subject: t.subject}))
})()
columnsåå: GETãªã¯ã¨ã¹ãã§ã¯å¸¸ã«
columnsãæå®ã対å¿ã¨ã³ããã¤ã³ãã§ã¯ãµã¼ãã¼å´ãã£ã«ã¿ãªã³ã°ãé対å¿ã§ãç¡è¦ãããã ããªã®ã§å¸¸ã«æå®ãã¦åé¡ãªããå¹ããªãã£ãå ´åã¯ã¯ã©ã¤ã¢ã³ãå´.map()ã§æ½åºãcolumnsã¯executeã¢ã¼ãå°ç¨ï¼discoverã¢ã¼ãã«ã¯é©ç¨ãããªãï¼ã
POSTãªã¯ã¨ã¹ãï¼ä½æã»æ´æ°ã»åé¤ï¼
// javascript_tool â MODE=INSERTã§æ°è¦ä½æ
(async () => {
const r = await fetch('/direct/rcms_api/mng_api/?mt=topics&ct=topics_edit_api&MODE=INSERT', {
method: 'POST',
credentials: 'include',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
subject: 'ã¿ã¤ãã«',
contents: 'æ¬æ',
topics_group_id: 1
})
});
const data = await r.json();
return JSON.stringify(data, null, 2);
})()
éè¦ãªã«ã¼ã«
| ã«ã¼ã« | 説æ |
|---|---|
| credentials | å
¨ãªã¯ã¨ã¹ãã« credentials: 'include' å¿
é |
| ãã©ã¡ã¼ã¿å½¢å¼ | å¿
ã mt/ct å½¢å¼ã使ç¨ï¼model/method å½¢å¼ã¯ä¸å¯ï¼ |
| GETé åãã©ã¡ã¼ã¿ | [] suffixå¿
é ï¼ä¾: topics_group_id[]=1ï¼ |
| POSTé åãã©ã¡ã¼ã¿ | ãã¤ãã£ãJSONé
åï¼ä¾: {"topics_group_id": [1]}ï¼ |
| ä»¶æ°å¶é | ã¬ã¹ãã³ã¹ã大ããå ´å㯠cnt ãã©ã¡ã¼ã¿ã§å¶é |
| columnsæå® | columns=col1,col2 ã§ã¬ã¹ãã³ã¹ã«ã©ã ãæå°éã«ããã対å¿ã¨ã³ããã¤ã³ãã§ã¯å¿
ãæå®ãããã¨ï¼javascript_toolã®åºåå¶é対çã»ã¬ã¹ãã³ã¹å¹çåï¼ãå¹ããªãã¨ã³ããã¤ã³ããããããããã®å ´åã¯ã¯ã©ã¤ã¢ã³ãå´ã§æ½åº |
| 夿´æä½ã®ç¢ºèª | insert/update/deleteã¯å®è¡åã«ã¦ã¼ã¶ã¼ã«ç¢ºèªããã㨠|
| ã¬ã¹ãã³ã¹åãè©°ã | javascript_toolã®åºåå¶éãããããã大ããªã¬ã¹ãã³ã¹ã¯å¿
è¦é¨åã®ã¿æ½åº |
ã¬ã¹ãã³ã¹æ§é ã䏿ãªå ´å
.map() ããåã« Object.keys() ã§æ§é ã確èªãããããã£åãæ¨æ¸¬ãã¦è¤æ°å試è¡ããã1åã§æ§é ãææ¡ãã:
(async () => {
const r = await fetch(url, {credentials:'include'});
const data = await r.json();
const keys = Object.keys(data);
const firstArrayKey = keys.find(k => Array.isArray(data[k]));
const firstItem = firstArrayKey ? data[firstArrayKey][0] : null;
return JSON.stringify({
topLevelKeys: keys, firstArrayKey,
firstItemKeys: firstItem ? Object.keys(firstItem) : null
}, null, 2);
})();
詳細㯠references/error-handling.md ãåç §
APIæ¢ç´¢
adviseã¢ã¼ãï¼AIæ¯æ´ãæ¨å¥¨ï¼
ãããããã¨ãèªç¶è¨èªã§ä¼ããã¨ãã©ã®APIãã©ã®é åºã§å¼ã¹ã°ãããAIãåçãããã¬ã¹ãã³ã¹ã® endpoint, api_spec ã¯ã·ã¹ãã ãèªåçæï¼ãã«ã·ãã¼ã·ã§ã³ãªãï¼ãsummary, description, body_example, note ã¯AIãçæã
// javascript_tool â ãããããã¨ããAPIæé ãåå¾
(async () => {
const r = await fetch('/direct/rcms_api/mng_api/?MODE=advise', {
method: 'POST',
credentials: 'include',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({request: 'è¨äºãæ°ãã使ããã'})
});
const data = await r.json();
return JSON.stringify(data.advice?.steps?.map(s => ({
step: s.step, description: s.description, mt: s.mt, ct: s.ct,
http_method: s.http_method, mode: s.mode, endpoint: s.endpoint
})), null, 2);
})()
discoverã¢ã¼ãï¼æ§é åJSONãé常ä¸è¦ï¼
// javascript_tool â ã¢ã¸ã¥ã¼ã«ä¸è¦§åå¾ï¼ç¹å®ã¢ã¸ã¥ã¼ã«ã¯ &mt=topics ã追å ï¼
(async () => {
const r = await fetch('/direct/rcms_api/mng_api/?MODE=discover', {credentials:'include'});
const data = await r.json();
return JSON.stringify(data.modules.map(m => ({mt: m.mt, controllers: m.controllers.map(c => c.ct)})), null, 2);
})()
使ãåã
| æ¹æ³ | ç¨é |
|---|---|
| llms.txtæ¦è¦ï¼æ¨å¥¨ï¼ | ãµã¤ãå ¨ä½ã®APIæ§é ãææ¡ï¼æåã«ä½¿ãï¼ |
| llms.txt詳細 | ç¹å®ã¢ã¸ã¥ã¼ã«ã®ãã©ã¡ã¼ã¿ä»æ§ãç¢ºèª |
| advise | ãããããã¨ããAPIæé ãAIãææ¡ï¼mt/ctã䏿ãªå ´åã«æç¨ï¼ |
| discover | ããã°ã©ã çã«ã¢ã¸ã¥ã¼ã«/ã³ã³ããã¼ã©ãåæï¼é常ä¸è¦ï¼ |
詳細㯠references/api-discovery.md ãåç §
管çç»é¢ãã©ã¦ã¶æä½
APIå¼ã³åºãã ãã§ã¯ä¸ååãªå ´åï¼ãã¡ã¤ã«ã¢ãããã¼ãããã¬ãã¥ã¼ãGUIè¨å®å¤æ´çï¼ã«ä½¿ç¨ã
æä½æé
mcp__claude-in-chrome__navigateã§ç®¡çç»é¢ãã¼ã¸ã¸ç§»åmcp__claude-in-chrome__read_pageã§ã¢ã¯ã»ã·ããªãã£ããªã¼åå¾mcp__claude-in-chrome__find/mcp__claude-in-chrome__form_input/mcp__claude-in-chrome__computerã§ãã©ã¼ã æä½mcp__claude-in-chrome__get_page_textã§ãã¼ã¸å 容åå¾
主è¦URL
| ãã¼ã¸ | URL |
|---|---|
| ã³ã³ãã³ãæ°è¦ä½æ | /management/topics/topics_edit/?topics_group_id={id} |
| ã³ã³ãã³ãç·¨é | /management/topics/topics_edit/?topics_id={id} |
| ã³ã³ãã³ãä¸è¦§ | /management/topics/topics_list/?topics_group_id={id} |
URLãã¿ã¼ã³ã¯
/management/{module}/{action}/ãå ¨URLä¸è¦§ã¯ references/admin-ui-patterns.md ãåç §
ã¨ã©ã¼ãã³ããªã³ã°
| ã³ã¼ã | åå | å¯¾å¦ |
|---|---|---|
| 401/403 | ã»ãã·ã§ã³åã/権éä¸è¶³ | ãã°ã¤ã³URLæ¡å ãåèªè¨¼å¾ãªãã©ã¤ |
| 400 | 䏿£ãã©ã¡ã¼ã¿ | llms.txt詳細ã§ä»æ§ç¢ºèªããã©ã¡ã¼ã¿ä¿®æ£ |
| 404 | ã¢ã¸ã¥ã¼ã«/ã³ã³ããã¼ã©ä¸å¨ | discoverã§åå¨ç¢ºèª |
| 500 | ãµã¼ãã¼ã¨ã©ã¼ | ãªã¯ã¨ã¹ãå 容ã確èªãåè©¦è¡ |
| Network Error | ã¿ããå¥ãã¡ã¤ã³ | Kurocoãã¡ã¤ã³ã®ã¿ãã§å®è¡ãã¦ãããç¢ºèª |
詳細㯠references/error-handling.md ãåç §
ã»ãã¥ãªãã£æ³¨æäºé
- Cookieå¤ã表示ã»ãã°åºåããªãã㨠â ã»ãã·ã§ã³æ å ±ã®æ¼æ´©é²æ¢
document.cookieã§ã®ãã¼ã¯ã³æ½åºã¯ç¦æ¢ â HttpOnlyã§åå¾ä¸å¯ãã¤ä¸è¦- 夿´æä½ã¯å¿ ãã¦ã¼ã¶ã¼ç¢ºèªå¾ã«å®è¡ â insert/update/deleteã¯åãæ¶ããå°é£
- APIã¬ã¹ãã³ã¹ã®ãã¡ã¤ã«ä¿åã¯ã¦ã¼ã¶ã¼åæå¿ é â å人æ å ±ãå«ãå¯è½æ§
- èªè¨¼æ å ±ãjavascript_toolã®åºåã«å«ããªã â ãããã¼ãCookieã®å 容ãè¿ããªã
javascript_tool ã®å®å ¨ãªä½¿ãæ¹
ãããã¯ã®ä»çµã¿
javascript_tool ã®è¿å´å¤ã¯ chromeæ¡å¼µã®ã»ãã¥ãªãã£ãã£ã«ã¿ãééããã以ä¸ãæ¤åºããã㨠[BLOCKED] ã«ç½®ãæãããã:
- ã»ãã·ã§ã³Cookieå¤ã
email/login_idçã®ã»ã³ã·ãã£ããªã¯ã¨ãªãã©ã¡ã¼ã¿ - ã¡ã¼ã«ã¢ãã¬ã¹ãå«ããã£ã¼ã«ãå¤ï¼ext_colã«æ ¼ç´ããã¦ããå ´åã対象ï¼
- å人æ å ±ãå«ã大éããã¹ã
åé¿ã«ã¼ã«ã¨æ¨å¥¨ãã¿ã¼ã³
| ã«ã¼ã« | çç± |
|---|---|
| è¿å´å¤ã¯å¿ è¦æå°éã«çµã | IDã»ä»¶æ°ã»ååã®ã¿çãå¿ è¦ãªãã£ã¼ã«ãã ãæ½åº |
| fetch() ã®çã¬ã¹ãã³ã¹ããã®ã¾ã¾è¿ããªã | Cookieé¢é£ãã¼ã¿ãæ··å ¥ããå¯è½æ§ |
| DOMå ¨ä½ã®textContentãè¿ããªã | hidden inputãURLæååã«ã»ã³ã·ãã£ãæ å ±ãå«ã¾ãã |
| URLãã©ã¡ã¼ã¿ãå¤ããã¼ã¸ã§ã¯æ³¨æ | URLèªä½ã«ã»ã³ã·ãã£ããªãã©ã¡ã¼ã¿åãå«ã¾ããã¨ãããã¯å¯¾è±¡ |
// â
å®å
¨ â mng_apiããcolumnsæå®+å¿
è¦ãã£ã¼ã«ãã®ã¿æ½åº
(async () => {
const r = await fetch('/direct/rcms_api/mng_api/?mt=topics&ct=topics_group_list&columns=topics_group_id,group_nm', {credentials:'include'});
const data = await r.json();
return JSON.stringify(data.topics_group_list?.map(g => ({id: g.topics_group_id, name: g.group_nm})));
})();
// â
å®å
¨ â ã¡ã¼ã«ã¢ãã¬ã¹ã¯å¤ãè¿ããå¤å®çµæã ãè¿ã
(async () => {
const target = 'user@example.com';
const r = await fetch('/direct/rcms_api/mng_api/?mt=topics&ct=topics_list&topics_group_id[]=1&cnt=30&columns=topics_id,subject,ext_col_03&keyword=' + encodeURIComponent(target), {credentials:'include'});
const data = await r.json();
return JSON.stringify(data.topics_list?.filter(t => {
return (t.ext_col_03 || []).some(v => v && v.includes(target));
}).map(t => ({id: t.topics_id, subject: t.subject})));
})();
ãã¼ã«å¥ã®å®å ¨åº¦
| ãã¼ã« | ãããã¯ãªã¹ã¯ | ç¨é |
|---|---|---|
get_page_text |
ä½ ï¼æ¡å¼µããã£ã«ã¿æ¸ã¿ããã¹ããè¿ãï¼ | ãã¼ã¸å ¨æã®èªã¿åã |
read_page |
ä½ ï¼ã¢ã¯ã»ã·ããªãã£ããªã¼ãCookieå«ã¾ãªãï¼ | DOMæ§é ã®ææ¡ |
javascript_tool + mng_api JSON |
ä½ ï¼å¿ è¦ãã£ã¼ã«ãã®ã¿æ½åºããã°å®å ¨ï¼ | ãã¼ã¿æä½ã»APIå®è¡ |
javascript_tool + fetch() â çããã¹ã |
é« | é¿ãã |
javascript_tool + DOMå
¨æåå¾ |
ä¸ãé« ï¼ãã¼ã¸å 容ã«ããï¼ | ç¹å®è¦ç´ ã®ã¿æ½åºã«éå® |
ä»ã¹ãã«ã¨ã®é£æº
| ã¹ãã« | ç¨é | 使ãåã |
|---|---|---|
/kuroco-api-content |
ããã³ãã¨ã³ãAPIè¨è¨ã»èªè¨¼ãã¿ã¼ã³ãã³ã³ãã³ãCRUDãã¿ã¼ã³ | ã¨ã³ãã¦ã¼ã¶ã¼åãAPI |
/kuroco-frontend-integration |
Nuxt.js/Next.jsçµ±åãAIèªåããã㤠| ããã³ãã¨ã³ãå®è£ |
/kuroco-docs |
Kurocoããã¥ã¡ã³ãåç § | å ¬å¼ããã¥ã¡ã³ãæ¤ç´¢ |
æ¬ã¹ãã«ã¯ãã©ã¦ã¶çµç±ã®mng_apiå®è¡ã¨ç®¡çç»é¢æä½ã«ç¹åã ããã³ãã¨ã³ãAPIï¼*.g.kuroco.appï¼ã®æä½ã«ã¯ä¸è¨ã®é¢é£ã¹ãã«ã使ç¨ãããã¨ã