[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M69BQHJCGD7F9TFVW01H43BK":3,"skill-same:01M69BQHJCGD7F9TFVW01H43BK":80},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":23,"publishedAt":47,"linkOnly":48,"markdownContent":49,"markdownBody":50,"frontMatter":51,"refName":56,"commitSha":57,"skillDirectory":58,"forksCount":59,"repositoryHtmlUrl":60,"repositoryHomepageUrl":61,"ownerHtmlUrl":62,"ownerBlogUrl":63,"ownerDescription":64,"updatedAt":65,"install":66,"resources":79},"01M69BQHJCGD7F9TFVW01H43BK","agora-workbench",null,"Drive Agora Workbench MCP servers — any server that exposes an execute_*_code tool — by writing Python that runs inside the server's persistent kernel, where its tools and libraries already live. Activate whenever an execute_*_code tool is connected and the user asks for work that could run there, BEFORE reaching for local shell, standalone scripts, or package installs. The server already has the environment; call its tool instead of rebuilding the capability locally.","microsoft\u002Fagora-workbench","microsoft","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F6154722?v=4","01M698VYDXZ6JW5WH3CRV650R8","Microsoft","01M69BQAMRBD1QNR2EDFDHXFS1",10,"MIT","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fagora-workbench\u002Fblob\u002Fmain\u002Fsrc\u002Fagora_workbench\u002Fskills\u002Fagora-workbench\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,9,43,44,45,46],"agora","agora workbench","Tools","capability","for","standalone","scripts","live","local","writing python","activate","environment","work","MCP","server","code","run","libraries","http","support","kernel","python","writing","2026-11-10 10:12:30",false,"---\nname: agora-workbench\ndescription: >\n  Drive Agora Workbench MCP servers — any server that exposes an\n  execute_*_code tool — by writing Python that runs inside the server's\n  persistent kernel, where its tools and libraries already live. Activate\n  whenever an execute_*_code tool is connected and the user asks for work that\n  could run there, BEFORE reaching for local shell, standalone scripts, or\n  package installs. The server already has the environment; call its tool\n  instead of rebuilding the capability locally.\ncompatibility: Requires an MCP-compatible agent client with Streamable HTTP transport support.\nmetadata:\n  author: microsoft\n  version: \"1.0\"\n---\n\n# Agora Workbench\n\n## Core Mental Model\n\n- When a server exposes an `execute_{server}_code` tool, that tool **is** the way to do the work — its tools and libraries are already installed in the server's kernel. Do not install packages or write standalone scripts locally to replicate what the server provides; call the tool. Even if the server's source is visible in your workspace, use the live tool — don't copy or re-implement it.\n- The server's tools are **Python functions injected into the kernel namespace** — they are NOT individual MCP tools. Call them by writing Python code inside `execute_{server}_code`.\n- Sessions are **persistent** — variables, imports, and state survive across `execute_{server}_code` calls. Do not recompute or re-import unnecessarily.\n- Always **discover before using** — call `search_{server}_tools` before assuming a function exists. Never guess tool names.\n\n## Discovery\n\nBefore writing any code, discover what is available:\n\n```\nsearch_{server}_tools(query=\"\", top=999)           # Full catalog\nsearch_{server}_tools(query=\"molecular weight\")    # Targeted search\nsearch_{server}_tools(query=\"screening\", category=\"skills\")  # Skills only\n```\n\n- Results are grouped into `tools` (callable functions) and `skills` (multi-step workflows).\n- If a skill matches the task, load it with `load_{server}_skill(skill_name=\"...\")` and follow its instructions.\n- If the task is simple, call tools directly.\n\n## Executing Code\n\nThe primary MCP tool is `execute_{server}_code`:\n\n| Parameter | Usage |\n|-----------|-------|\n| `code` | Python code that calls the server's functions from the kernel namespace |\n| `description` | One-sentence summary shown to the user — **always set this** |\n| `timeout` | Seconds before execution is killed (increase for heavy computation) |\n| `background` | Set `True` for long-running jobs; poll with `{server}_check_job(job_id=...)` |\n| `execution_session_id` | Existing execution session to resume from another agent or MCP connection |\n\n### Canonical example\n\n```\n# 1. Discover\nsearch_{server}_tools(query=\"data processing\")\n\n# 2. Execute\nexecute_{server}_code(\n    description=\"Process input data and extract results\",\n    code=\"result = process_data(input_id='item_001')\\nprint(result)\",\n    timeout=60\n)\n```\n\n### Error handling\n\n- If execution fails, read `stderr` and `error` from the result.\n- Fix the code and retry in the same session — prior state is still available.\n- If a tool raises `ValueError`, it means invalid input. Read the message and adjust arguments.\n\n## Sessions and State\n\n- A session is created automatically on first `execute_{server}_code` call.\n- All subsequent calls reuse the same session (variables persist).\n- To continue an active session from another agent or MCP connection, pass its\n  returned `session_id` as `execution_session_id` to `execute_{server}_code`.\n  This is not the MCP transport session ID; unknown, expired, or unauthorized\n  IDs fail rather than creating a new session.\n- Use `{server}_inspect_session(session_id=...)` to see what variables exist and check background job status.\n- Use `{server}_close_session(session_id=...)` only when done with a server entirely.\n- Use `{server}_list_sessions()` to see active sessions.\n\n## Artifacts and Publishing\n\nSee the [artifacts sub-skill](skills\u002Fartifacts\u002FSKILL.md) for data fetching, cross-server transfer, and destination tag details.\n\n## Workflow Planning\n\nFor complex multi-step tasks with ordered dependencies, use the state graph:\n\n```\nplan_{server}_workflow(mode=\"overview\")    # See the full graph\nplan_{server}_workflow(mode=\"path\", current_state=\"...\", target_state=\"...\")  # Get a sequence\n```\n\nSee the [workflow-planning sub-skill](skills\u002Fworkflow-planning\u002FSKILL.md) for full mode details and skill loading patterns.\n\n## Parallel Tool Execution\n\nSee the [async-execution sub-skill](skills\u002Fasync-execution\u002FSKILL.md) for submitting background jobs for long-running code and parallel execution across multiple inputs.\n\n## Handling Large Objects\n\nStdout from `execute_{server}_code` is returned in the MCP tool response and\nconsumed as agent context tokens. Overflowing this with large objects wastes\ncontext, triggers server-side truncation, and can degrade agent reasoning.\n\n### Rules\n\n1. **Never print large objects verbatim** — no `print(df)`, `print(long_list)`,\n   or `print(json.dumps(big_dict))`.\n2. **Summarize instead** — use `.head()`, `.shape`, `len()`, `.describe()`,\n   `.columns.tolist()`, or slicing to extract only what you need.\n3. **Store results in variables** — keep data in the persistent session and\n   inspect it with targeted follow-up calls:\n   ```python\n   # ✓ Good — store and summarize\n   result = compute_expensive_thing(...)\n   print(f\"Shape: {result.shape}, columns: {result.columns.tolist()}\")\n   print(result.head(5).to_string())\n\n   # ✗ Bad — dumps entire object into MCP response\n   result = compute_expensive_thing(...)\n   print(result)\n   ```\n4. **Write large outputs to files** — use `agora_output(\"name\")` (or the\n   `AGORA_OUTPUT_DIR` variable) for data intended for the user; use `\u002Ftmp` for\n   intermediate scratch files you'll read back server-side. See the\n   [artifacts sub-skill](skills\u002Fartifacts\u002FSKILL.md) for the output path helpers.\n5. **Use `{server}_send`** for cross-server transfers — never serialize\n   large objects through stdout to paste into another server call.\n6. **Paginate when exploring** — if you need to see rows 50–100 of a DataFrame,\n   slice it: `print(df.iloc[50:100].to_string())`.\n\n### What happens if you exceed the limit\n\nThe server truncates stdout\u002Fstderr that exceeds its configured threshold\n(default 50 KB). The truncated response includes a notice. While this prevents\ncontext overflow, the lost information may require re-execution — so avoid\nhitting the limit proactively.\n\n## Do Not\n\n- Do not `pip`\u002F`uv install` packages or write standalone local scripts to do work a connected `execute_{server}_code` tool already covers — the kernel already has the environment. Even if the server's source is in your workspace, call the live tool; do not copy or re-implement it.\n- Do not call the server's functions as MCP tools — they only exist inside the kernel.\n- Do not guess tool names — always search first.\n- Do not write output files outside `AGORA_OUTPUT_DIR`.\n- Do not paste large data into chat when `{server}_send` can transfer it server-to-server.\n- Do not print entire DataFrames, large lists, or raw API responses — summarize or slice.\n- Do not run long jobs synchronously — use `background=True` and poll.\n- Do not create new sessions unnecessarily — reuse the existing one.\n- Do not publish artifacts unless the user explicitly asks for a download or export.\n","# Agora Workbench\n\n## Core Mental Model\n\n- When a server exposes an `execute_{server}_code` tool, that tool **is** the way to do the work — its tools and libraries are already installed in the server's kernel. Do not install packages or write standalone scripts locally to replicate what the server provides; call the tool. Even if the server's source is visible in your workspace, use the live tool — don't copy or re-implement it.\n- The server's tools are **Python functions injected into the kernel namespace** — they are NOT individual MCP tools. Call them by writing Python code inside `execute_{server}_code`.\n- Sessions are **persistent** — variables, imports, and state survive across `execute_{server}_code` calls. Do not recompute or re-import unnecessarily.\n- Always **discover before using** — call `search_{server}_tools` before assuming a function exists. Never guess tool names.\n\n## Discovery\n\nBefore writing any code, discover what is available:\n\n```\nsearch_{server}_tools(query=\"\", top=999)           # Full catalog\nsearch_{server}_tools(query=\"molecular weight\")    # Targeted search\nsearch_{server}_tools(query=\"screening\", category=\"skills\")  # Skills only\n```\n\n- Results are grouped into `tools` (callable functions) and `skills` (multi-step workflows).\n- If a skill matches the task, load it with `load_{server}_skill(skill_name=\"...\")` and follow its instructions.\n- If the task is simple, call tools directly.\n\n## Executing Code\n\nThe primary MCP tool is `execute_{server}_code`:\n\n| Parameter | Usage |\n|-----------|-------|\n| `code` | Python code that calls the server's functions from the kernel namespace |\n| `description` | One-sentence summary shown to the user — **always set this** |\n| `timeout` | Seconds before execution is killed (increase for heavy computation) |\n| `background` | Set `True` for long-running jobs; poll with `{server}_check_job(job_id=...)` |\n| `execution_session_id` | Existing execution session to resume from another agent or MCP connection |\n\n### Canonical example\n\n```\n# 1. Discover\nsearch_{server}_tools(query=\"data processing\")\n\n# 2. Execute\nexecute_{server}_code(\n    description=\"Process input data and extract results\",\n    code=\"result = process_data(input_id='item_001')\\nprint(result)\",\n    timeout=60\n)\n```\n\n### Error handling\n\n- If execution fails, read `stderr` and `error` from the result.\n- Fix the code and retry in the same session — prior state is still available.\n- If a tool raises `ValueError`, it means invalid input. Read the message and adjust arguments.\n\n## Sessions and State\n\n- A session is created automatically on first `execute_{server}_code` call.\n- All subsequent calls reuse the same session (variables persist).\n- To continue an active session from another agent or MCP connection, pass its\n  returned `session_id` as `execution_session_id` to `execute_{server}_code`.\n  This is not the MCP transport session ID; unknown, expired, or unauthorized\n  IDs fail rather than creating a new session.\n- Use `{server}_inspect_session(session_id=...)` to see what variables exist and check background job status.\n- Use `{server}_close_session(session_id=...)` only when done with a server entirely.\n- Use `{server}_list_sessions()` to see active sessions.\n\n## Artifacts and Publishing\n\nSee the [artifacts sub-skill](skills\u002Fartifacts\u002FSKILL.md) for data fetching, cross-server transfer, and destination tag details.\n\n## Workflow Planning\n\nFor complex multi-step tasks with ordered dependencies, use the state graph:\n\n```\nplan_{server}_workflow(mode=\"overview\")    # See the full graph\nplan_{server}_workflow(mode=\"path\", current_state=\"...\", target_state=\"...\")  # Get a sequence\n```\n\nSee the [workflow-planning sub-skill](skills\u002Fworkflow-planning\u002FSKILL.md) for full mode details and skill loading patterns.\n\n## Parallel Tool Execution\n\nSee the [async-execution sub-skill](skills\u002Fasync-execution\u002FSKILL.md) for submitting background jobs for long-running code and parallel execution across multiple inputs.\n\n## Handling Large Objects\n\nStdout from `execute_{server}_code` is returned in the MCP tool response and\nconsumed as agent context tokens. Overflowing this with large objects wastes\ncontext, triggers server-side truncation, and can degrade agent reasoning.\n\n### Rules\n\n1. **Never print large objects verbatim** — no `print(df)`, `print(long_list)`,\n   or `print(json.dumps(big_dict))`.\n2. **Summarize instead** — use `.head()`, `.shape`, `len()`, `.describe()`,\n   `.columns.tolist()`, or slicing to extract only what you need.\n3. **Store results in variables** — keep data in the persistent session and\n   inspect it with targeted follow-up calls:\n   ```python\n   # ✓ Good — store and summarize\n   result = compute_expensive_thing(...)\n   print(f\"Shape: {result.shape}, columns: {result.columns.tolist()}\")\n   print(result.head(5).to_string())\n\n   # ✗ Bad — dumps entire object into MCP response\n   result = compute_expensive_thing(...)\n   print(result)\n   ```\n4. **Write large outputs to files** — use `agora_output(\"name\")` (or the\n   `AGORA_OUTPUT_DIR` variable) for data intended for the user; use `\u002Ftmp` for\n   intermediate scratch files you'll read back server-side. See the\n   [artifacts sub-skill](skills\u002Fartifacts\u002FSKILL.md) for the output path helpers.\n5. **Use `{server}_send`** for cross-server transfers — never serialize\n   large objects through stdout to paste into another server call.\n6. **Paginate when exploring** — if you need to see rows 50–100 of a DataFrame,\n   slice it: `print(df.iloc[50:100].to_string())`.\n\n### What happens if you exceed the limit\n\nThe server truncates stdout\u002Fstderr that exceeds its configured threshold\n(default 50 KB). The truncated response includes a notice. While this prevents\ncontext overflow, the lost information may require re-execution — so avoid\nhitting the limit proactively.\n\n## Do Not\n\n- Do not `pip`\u002F`uv install` packages or write standalone local scripts to do work a connected `execute_{server}_code` tool already covers — the kernel already has the environment. Even if the server's source is in your workspace, call the live tool; do not copy or re-implement it.\n- Do not call the server's functions as MCP tools — they only exist inside the kernel.\n- Do not guess tool names — always search first.\n- Do not write output files outside `AGORA_OUTPUT_DIR`.\n- Do not paste large data into chat when `{server}_send` can transfer it server-to-server.\n- Do not print entire DataFrames, large lists, or raw API responses — summarize or slice.\n- Do not run long jobs synchronously — use `background=True` and poll.\n- Do not create new sessions unnecessarily — reuse the existing one.\n- Do not publish artifacts unless the user explicitly asks for a download or export.\n",{"name":5,"metadata":52,"description":54,"compatibility":55},{"author":9,"version":53},"1.0","Drive Agora Workbench MCP servers — any server that exposes an execute_*_code tool — by writing Python that runs inside the server's persistent kernel, where its tools and libraries already live. Activate whenever an execute_*_code tool is connected and the user asks for work that could run there, BEFORE reaching for local shell, standalone scripts, or package installs. The server already has the environment; call its tool instead of rebuilding the capability locally.\n","Requires an MCP-compatible agent client with Streamable HTTP transport support.","main","719fc2f6e67325f49765af1b2015f3fb22448e49","src\u002Fagora_workbench\u002Fskills\u002Fagora-workbench",7,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fagora-workbench","https:\u002F\u002Fmicrosoft.github.io\u002Fagora-workbench","https:\u002F\u002Fgithub.com\u002Fmicrosoft","https:\u002F\u002Fopensource.microsoft.com","Open source projects and samples from Microsoft","2026-11-11 03:45:26",{"source":8,"skillName":5,"commands":67,"prompt":77,"zipAvailable":78},[68,71,74],{"tool":69,"command":70},"npx","npx skills add microsoft\u002Fagora-workbench --skill agora-workbench",{"tool":72,"command":73},"bunx","bunx skills add microsoft\u002Fagora-workbench --skill agora-workbench",{"tool":75,"command":76},"pnpm","pnpm dlx skills add microsoft\u002Fagora-workbench --skill agora-workbench","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fagora-workbench\u002Fblob\u002Fmain\u002Fsrc\u002Fagora_workbench\u002Fskills\u002Fagora-workbench\u002FSKILL.md",true,[],[81,108,126,144,170,183],{"skillNo":82,"name":83,"nameZh":6,"description":84,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":85,"categories":86,"keywords":88,"publishedAt":47},"01M69BQPSTYX8PJETAN8VM0YP6","workflow-planning","Plan and navigate multi-step domain workflows using the state graph. Activate when a task involves ordered tool dependencies, multiple state transitions, or when unsure which tool to call next in a domain sequence.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fagora-workbench\u002Fblob\u002Fmain\u002Fsrc\u002Fagora_workbench\u002Fskills\u002Fagora-workbench\u002Fskills\u002Fworkflow-planning\u002FSKILL.md",[87],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[89,90,91,92,93,94,95,96,34,97,98,99,100,101,102,103,104,105,106,107],"workflow","planning","workflow planning","workflows","state","graph","plan","tool","task","call","next","dependencies","domain","transitions","multi","which","sequence","navigate","when",{"skillNo":109,"name":110,"nameZh":6,"description":111,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":112,"categories":113,"keywords":114,"publishedAt":47},"01M69BQN6ZZHSKX92521QNA87Q","async-execution","Run long-running or parallel code asynchronously. Activate when code will take more than 30 seconds, when processing many independent inputs, or when the user asks to run something in the background.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fagora-workbench\u002Fblob\u002Fmain\u002Fsrc\u002Fagora_workbench\u002Fskills\u002Fagora-workbench\u002Fskills\u002Fasync-execution\u002FSKILL.md",[],[115,116,117,40,39,118,119,120,34,121,122,123,124,107,125],"async execution","execution","async","parallel","user","take","long","processing","more","background","running",{"skillNo":127,"name":128,"nameZh":6,"description":129,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":130,"categories":131,"keywords":132,"publishedAt":47},"01M69BQKWX7374C5XGQPRK4TM1","artifacts","Fetch data assets into the kernel, transfer Python objects between servers, and publish output files to the user. Activate when working with data files, cross-server data movement, or when the user asks for downloads or exports.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fagora-workbench\u002Fblob\u002Fmain\u002Fsrc\u002Fagora_workbench\u002Fskills\u002Fagora-workbench\u002Fskills\u002Fartifacts\u002FSKILL.md",[],[128,45,44,133,38,134,135,136,137,119,138,139,34,140,141,142,28,143,107],"transfer","downloads","publish","data","assets","fetch","files","objects","output","with","servers",{"skillNo":145,"name":146,"nameZh":6,"description":147,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":148,"categories":149,"keywords":150,"publishedAt":47},"01M69BQFZW6WC202FTGNE7NTQ0","energysystems-pypsa","Power system modeling and analysis with PyPSA inside execute_energysystems_code — network setup, components, power flow, optimal dispatch, capacity expansion, cost and topology analysis. Covers PyPSA conventions and the gotchas that cause silently wrong results.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fagora-workbench\u002Fblob\u002Fmain\u002Fexamples\u002Fservers\u002Fenergysystems\u002Fskills\u002FSKILL.md",[],[151,152,153,154,39,155,156,157,158,159,160,161,162,163,164,165,166,167,142,168,169],"energysystems pypsa","components","capacity","setup","topology","network","flow","analysis","system","results","execute","power","dispatch","cost","conventions","modeling","power flow","expansion","Wrong",{"skillNo":171,"name":172,"nameZh":6,"description":173,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":174,"categories":175,"keywords":176,"publishedAt":47},"01M69BQE9ZJK1WRJZQRG7KDT88","earthscience-stac","How to find and load data from Microsoft Planetary Computer (STAC) inside execute_earthscience_code.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fagora-workbench\u002Fblob\u002Fmain\u002Fexamples\u002Fservers\u002Fearthscience\u002Fskills\u002FSKILL.md",[],[177,9,39,136,178,179,180,161,181,182],"earthscience stac","how","computer","find","how to","load",{"skillNo":184,"name":185,"nameZh":6,"description":186,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":187,"categories":188,"keywords":189,"publishedAt":47},"01M69BQCW3X4T986QTR9N9QXY5","chemistry-rdkit","Molecular analysis and cheminformatics using RDKit — SMILES handling, descriptor calculation, fingerprints, substructure search, similarity, clustering, and drug-likeness screening via domain tools and the execute_chemistry_code tool.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fagora-workbench\u002Fblob\u002Fmain\u002Fexamples\u002Fservers\u002Fchemistry\u002Fskills\u002FSKILL.md",[],[190,191,39,192,26,158,96,161,101,193,194,195,196,197,198,199,200,201,202,203],"chemistry rdkit","rdkit","search","molecular","similarity","via","calculation","screening","likeness","groups","filtered","Molecules","SMILES","Fingerprints"]