[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M69BQKWX7374C5XGQPRK4TM1":3,"skill-same:01M69BQKWX7374C5XGQPRK4TM1":66},{"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":18,"publishedAt":37,"linkOnly":38,"markdownContent":39,"markdownBody":40,"frontMatter":41,"refName":42,"commitSha":43,"skillDirectory":44,"forksCount":45,"repositoryHtmlUrl":46,"repositoryHomepageUrl":47,"ownerHtmlUrl":48,"ownerBlogUrl":49,"ownerDescription":50,"updatedAt":51,"install":52,"resources":65},"01M69BQKWX7374C5XGQPRK4TM1","artifacts",null,"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.","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\u002Fskills\u002Fartifacts\u002FSKILL.md",[],[5,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36],"user","when","servers","for","with","output","objects","activate","files","fetch","python","assets","data","publish","downloads","server","transfer","kernel","2026-11-10 10:12:30",false,"---\nname: artifacts\ndescription: >\n  Fetch data assets into the kernel, transfer Python objects between servers,\n  and publish output files to the user. Activate when working with data files,\n  cross-server data movement, or when the user asks for downloads or exports.\n---\n\n# Artifacts: Fetch, Transfer, and Publish\n\n## Discovering Data Assets\n\nServers with a data catalog expose tools for finding available datasets:\n\n```\nsearch_data(query=\"temperature observations\", domain=\"earthscience\", top=5)\nlist_domains()                    # See all available data domains\nget_artifact(artifact_id=\"...\")   # Get full metadata for a specific artifact\nquery_catalog(sql=\"SELECT name, domain, description FROM artifacts WHERE domain = 'powergrid'\")\n```\n\n**Not all servers have a data catalog.** These tools (`search_data`,\n`list_domains`, `get_artifact`, `query_catalog`) are registered only when the\nserver is configured with one — and unlike most tools they are **not** prefixed\nwith the server name. If they are not in the server's tool list, the server has\nno caller-visible catalog: skip them and use the data references the user\nprovides directly. These legacy tools are unscoped: their presence means the\nserver operator has chosen to expose the entire catalog to callers with tool\naccess. Read-only `query_catalog` prevents writes but is not caller\nauthorization. Configuring and protecting a catalog is a server-author\u002Fdeployment\ntask, not something you can do from the client side.\n\nWhen present, results include the artifact's `storage_uri`, `domain`,\n`source_type` (local or blob), `description`, and `content_type`. Use these\ntools to find the correct asset reference before using it in code.\n\n## Fetching Data Assets\n\nAsset references use a **type-tagged format** where the tag indicates the storage\nbackend and the inner value is the artifact identifier to resolve:\n\n| Tag format | Storage location | Example |\n|------------|------------------|---------|\n| `\u003Cblob>{artifact_id}\u003C\u002Fblob>` | Azure Blob Storage (resolved server-side from the artifact ID) | `\u003Cblob>abc123\u003C\u002Fblob>` |\n| `\u003Clocal>\u002Fdata\u002Fgrid\u002Flines.geojson\u003C\u002Flocal>` | Server local filesystem | `\u003Clocal>\u002Fdata\u002Fgrid\u002Flines.geojson\u003C\u002Flocal>` |\n\nFor blob assets, use the artifact `id` returned by `search_data` \u002F `get_artifact` inside the `\u003Cblob>…\u003C\u002Fblob>` tag (not a blob path).\nEmbed these tagged references as string literals in your code — the server\nautomatically detects them, downloads the file to a local cache, and replaces\nthe literal with a `Path` variable:\n\n```python\n# The tag tells the server which asset to resolve; it is replaced with a local Path at runtime\ndf = pd.read_csv(\"\u003Cblob>abc123\u003C\u002Fblob>\")\nnetwork = load_network(\"\u003Clocal>\u002Fdata\u002Fgrid\u002Ftexas_grid.nc\u003C\u002Flocal>\")\n```\n\nYou do not need to handle authentication or downloads — the server's managed\nidentity fetches the data on your behalf.\n\n## Cross-Server Object Transfer\n\nMove Python objects between servers without serializing through agent context:\n\n```\n{server}_send(data_ref=\"molecule_data\", to=\"gis\", name=\"input_data\")\n```\n\n### Addressing the target server\n\nUse the **logical server name** (e.g., `\"gis\"`, `\"chemistry\"`) as the `to`\nparameter. The server resolves this to the correct internal address based on\nits deployment configuration.\n\nIf the transfer fails with a connection or trust error, the error message will\nindicate the expanded URL and what went wrong. Surface this error to the user —\nit is an operator configuration issue (the environment variables\n`OBJECT_TRANSFER_TRUSTED_HTTP_HOSTS` or `OBJECT_TRANSFER_ALLOWED_HOSTS` may\nneed to be adjusted by the deployment operator).\n\nDo not attempt to guess deployment URLs, ports, or hostnames — the logical name\nis the correct default in all environments.\n\n### Parameters\n\n| Parameter | Usage |\n|-----------|-------|\n| `data_ref` | Kernel variable name or filename in `AGORA_OUTPUT_DIR` to transfer |\n| `to` | Logical destination name (e.g., `\"gis\"`, `\"blob\"`, `\"user\"`, `\"local\"`) |\n| `name` | Variable name at destination (defaults to `data_ref` if empty) |\n| `path` | Full destination path for blob\u002Flocal publishers (e.g., `\"outputs\u002Freport.csv\"`) |\n| `session_id` | Target session ID (if empty, uses the caller's first active session on target) |\n\n### When to use object transfer\n\n- Passing DataFrames, arrays, or complex objects between domain servers.\n- Avoiding token-heavy serialization of large data in chat context.\n- Multi-domain workflows where one server produces input for another.\n\n## Publishing Artifacts\n\nTo produce downloadable files for the user:\n\n1. Write files to the session output directory inside `execute_{server}_code`.\n   The kernel pre-injects a helper and a variable for this — never resolve the\n   path to an absolute string yourself:\n\n   ```python\n   # ✓ Preferred — agora_output() builds the path for you, no f-string needed\n   df.to_csv(agora_output(\"results.csv\"), index=False)\n\n   # ✓ Also correct — use the pre-injected variable name directly\n   df.to_csv(f\"{AGORA_OUTPUT_DIR}\u002Fresults.csv\", index=False)\n\n   # ✓ Also correct — read AGORA_OUTPUT_DIR from the environment\n   import os\n   df.to_csv(f\"{os.environ['AGORA_OUTPUT_DIR']}\u002Fresults.csv\", index=False)\n\n   # ✗ WRONG — do not hardcode the resolved path (triggers path guardrails)\n   df.to_csv(\"\u002Ftmp\u002Fagora_output_abc123\u002Fresults.csv\", index=False)\n   ```\n\n   Both `agora_output(\"name\")` and the bare `AGORA_OUTPUT_DIR` symbol are\n   injected automatically — no `import` is required to use them.\n\n2. Publish only when the user explicitly requests a download or export:\n   ```\n   {server}_send(data_ref=\"results.csv\", to=\"user\")\n   ```\n\n### Destinations\n\n| Destination | Publisher | Use case |\n|-------------|-----------|----------|\n| `\"user\"` | GuiPublisher | Browser download for the user |\n| `\"blob\"` | BlobPublisher | Azure Blob Storage |\n| `\"local\"` | LocalFilePublisher | Local filesystem |\n\n**Not all destinations are available on every server.** Available destinations\ndepend on the server's configured publishers. If you use an unsupported\ndestination, the tool returns an error listing the available options. When\nunsure, try `\"user\"` first — the GuiPublisher is always available.\n\n### Rules\n\n- Only write user-facing files to `AGORA_OUTPUT_DIR` — files elsewhere stay inside the container.\n- Build output paths with `agora_output(\"name\")` or the `AGORA_OUTPUT_DIR` variable — never hardcode the resolved absolute path.\n- Do not publish unless the user asks for a download or export.\n- The `data_ref` must match a file already written to `AGORA_OUTPUT_DIR` (for file-based sends).\n","# Artifacts: Fetch, Transfer, and Publish\n\n## Discovering Data Assets\n\nServers with a data catalog expose tools for finding available datasets:\n\n```\nsearch_data(query=\"temperature observations\", domain=\"earthscience\", top=5)\nlist_domains()                    # See all available data domains\nget_artifact(artifact_id=\"...\")   # Get full metadata for a specific artifact\nquery_catalog(sql=\"SELECT name, domain, description FROM artifacts WHERE domain = 'powergrid'\")\n```\n\n**Not all servers have a data catalog.** These tools (`search_data`,\n`list_domains`, `get_artifact`, `query_catalog`) are registered only when the\nserver is configured with one — and unlike most tools they are **not** prefixed\nwith the server name. If they are not in the server's tool list, the server has\nno caller-visible catalog: skip them and use the data references the user\nprovides directly. These legacy tools are unscoped: their presence means the\nserver operator has chosen to expose the entire catalog to callers with tool\naccess. Read-only `query_catalog` prevents writes but is not caller\nauthorization. Configuring and protecting a catalog is a server-author\u002Fdeployment\ntask, not something you can do from the client side.\n\nWhen present, results include the artifact's `storage_uri`, `domain`,\n`source_type` (local or blob), `description`, and `content_type`. Use these\ntools to find the correct asset reference before using it in code.\n\n## Fetching Data Assets\n\nAsset references use a **type-tagged format** where the tag indicates the storage\nbackend and the inner value is the artifact identifier to resolve:\n\n| Tag format | Storage location | Example |\n|------------|------------------|---------|\n| `\u003Cblob>{artifact_id}\u003C\u002Fblob>` | Azure Blob Storage (resolved server-side from the artifact ID) | `\u003Cblob>abc123\u003C\u002Fblob>` |\n| `\u003Clocal>\u002Fdata\u002Fgrid\u002Flines.geojson\u003C\u002Flocal>` | Server local filesystem | `\u003Clocal>\u002Fdata\u002Fgrid\u002Flines.geojson\u003C\u002Flocal>` |\n\nFor blob assets, use the artifact `id` returned by `search_data` \u002F `get_artifact` inside the `\u003Cblob>…\u003C\u002Fblob>` tag (not a blob path).\nEmbed these tagged references as string literals in your code — the server\nautomatically detects them, downloads the file to a local cache, and replaces\nthe literal with a `Path` variable:\n\n```python\n# The tag tells the server which asset to resolve; it is replaced with a local Path at runtime\ndf = pd.read_csv(\"\u003Cblob>abc123\u003C\u002Fblob>\")\nnetwork = load_network(\"\u003Clocal>\u002Fdata\u002Fgrid\u002Ftexas_grid.nc\u003C\u002Flocal>\")\n```\n\nYou do not need to handle authentication or downloads — the server's managed\nidentity fetches the data on your behalf.\n\n## Cross-Server Object Transfer\n\nMove Python objects between servers without serializing through agent context:\n\n```\n{server}_send(data_ref=\"molecule_data\", to=\"gis\", name=\"input_data\")\n```\n\n### Addressing the target server\n\nUse the **logical server name** (e.g., `\"gis\"`, `\"chemistry\"`) as the `to`\nparameter. The server resolves this to the correct internal address based on\nits deployment configuration.\n\nIf the transfer fails with a connection or trust error, the error message will\nindicate the expanded URL and what went wrong. Surface this error to the user —\nit is an operator configuration issue (the environment variables\n`OBJECT_TRANSFER_TRUSTED_HTTP_HOSTS` or `OBJECT_TRANSFER_ALLOWED_HOSTS` may\nneed to be adjusted by the deployment operator).\n\nDo not attempt to guess deployment URLs, ports, or hostnames — the logical name\nis the correct default in all environments.\n\n### Parameters\n\n| Parameter | Usage |\n|-----------|-------|\n| `data_ref` | Kernel variable name or filename in `AGORA_OUTPUT_DIR` to transfer |\n| `to` | Logical destination name (e.g., `\"gis\"`, `\"blob\"`, `\"user\"`, `\"local\"`) |\n| `name` | Variable name at destination (defaults to `data_ref` if empty) |\n| `path` | Full destination path for blob\u002Flocal publishers (e.g., `\"outputs\u002Freport.csv\"`) |\n| `session_id` | Target session ID (if empty, uses the caller's first active session on target) |\n\n### When to use object transfer\n\n- Passing DataFrames, arrays, or complex objects between domain servers.\n- Avoiding token-heavy serialization of large data in chat context.\n- Multi-domain workflows where one server produces input for another.\n\n## Publishing Artifacts\n\nTo produce downloadable files for the user:\n\n1. Write files to the session output directory inside `execute_{server}_code`.\n   The kernel pre-injects a helper and a variable for this — never resolve the\n   path to an absolute string yourself:\n\n   ```python\n   # ✓ Preferred — agora_output() builds the path for you, no f-string needed\n   df.to_csv(agora_output(\"results.csv\"), index=False)\n\n   # ✓ Also correct — use the pre-injected variable name directly\n   df.to_csv(f\"{AGORA_OUTPUT_DIR}\u002Fresults.csv\", index=False)\n\n   # ✓ Also correct — read AGORA_OUTPUT_DIR from the environment\n   import os\n   df.to_csv(f\"{os.environ['AGORA_OUTPUT_DIR']}\u002Fresults.csv\", index=False)\n\n   # ✗ WRONG — do not hardcode the resolved path (triggers path guardrails)\n   df.to_csv(\"\u002Ftmp\u002Fagora_output_abc123\u002Fresults.csv\", index=False)\n   ```\n\n   Both `agora_output(\"name\")` and the bare `AGORA_OUTPUT_DIR` symbol are\n   injected automatically — no `import` is required to use them.\n\n2. Publish only when the user explicitly requests a download or export:\n   ```\n   {server}_send(data_ref=\"results.csv\", to=\"user\")\n   ```\n\n### Destinations\n\n| Destination | Publisher | Use case |\n|-------------|-----------|----------|\n| `\"user\"` | GuiPublisher | Browser download for the user |\n| `\"blob\"` | BlobPublisher | Azure Blob Storage |\n| `\"local\"` | LocalFilePublisher | Local filesystem |\n\n**Not all destinations are available on every server.** Available destinations\ndepend on the server's configured publishers. If you use an unsupported\ndestination, the tool returns an error listing the available options. When\nunsure, try `\"user\"` first — the GuiPublisher is always available.\n\n### Rules\n\n- Only write user-facing files to `AGORA_OUTPUT_DIR` — files elsewhere stay inside the container.\n- Build output paths with `agora_output(\"name\")` or the `AGORA_OUTPUT_DIR` variable — never hardcode the resolved absolute path.\n- Do not publish unless the user asks for a download or export.\n- The `data_ref` must match a file already written to `AGORA_OUTPUT_DIR` (for file-based sends).\n",{"name":5,"description":7},"main","719fc2f6e67325f49765af1b2015f3fb22448e49","src\u002Fagora_workbench\u002Fskills\u002Fagora-workbench\u002Fskills\u002Fartifacts",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-14 02:43:23",{"source":8,"skillName":5,"commands":53,"prompt":63,"zipAvailable":64},[54,57,60],{"tool":55,"command":56},"npx","npx skills add microsoft\u002Fagora-workbench --skill artifacts",{"tool":58,"command":59},"bunx","bunx skills add microsoft\u002Fagora-workbench --skill artifacts",{"tool":61,"command":62},"pnpm","pnpm dlx skills add microsoft\u002Fagora-workbench --skill artifacts","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fagora-workbench\u002Fblob\u002Fmain\u002Fsrc\u002Fagora_workbench\u002Fskills\u002Fagora-workbench\u002Fskills\u002Fartifacts\u002FSKILL.md",true,[],[67,97,116,140,166,179],{"skillNo":68,"name":69,"nameZh":6,"description":70,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":71,"categories":72,"keywords":78,"publishedAt":37},"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",[73],{"categoryNo":74,"categoryName":75,"taxonomyType":76,"taxonomyTypeDesc":77},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[79,80,81,82,83,84,85,86,26,87,88,89,90,91,92,93,94,95,96,20],"workflow","planning","workflow planning","workflows","state","graph","plan","tool","task","call","next","dependencies","domain","transitions","multi","which","sequence","navigate",{"skillNo":98,"name":99,"nameZh":6,"description":100,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":101,"categories":102,"keywords":103,"publishedAt":37},"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",[],[104,105,106,107,108,109,19,110,26,111,112,113,114,20,115],"async execution","execution","async","run","code","parallel","take","long","processing","more","background","running",{"skillNo":117,"name":118,"nameZh":6,"description":119,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":120,"categories":121,"keywords":123,"publishedAt":37},"01M69BQHJCGD7F9TFVW01H43BK","agora-workbench","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.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fagora-workbench\u002Fblob\u002Fmain\u002Fsrc\u002Fagora_workbench\u002Fskills\u002Fagora-workbench\u002FSKILL.md",[122],{"categoryNo":74,"categoryName":75,"taxonomyType":76,"taxonomyTypeDesc":77},[124,125,126,127,29,36,128,9,129,130,107,108,34,131,132,133,26,134,135,136,137,138,22,139],"agora workbench","agora","MCP","writing","support","http","libraries","Tools","work","environment","writing python","local","live","scripts","standalone","capability",{"skillNo":141,"name":142,"nameZh":6,"description":143,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":144,"categories":145,"keywords":146,"publishedAt":37},"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",[],[147,148,149,150,108,151,152,153,154,155,156,157,158,159,160,161,162,163,23,164,165],"energysystems pypsa","components","capacity","setup","topology","network","flow","analysis","system","results","execute","power","dispatch","cost","conventions","modeling","power flow","expansion","Wrong",{"skillNo":167,"name":168,"nameZh":6,"description":169,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":170,"categories":171,"keywords":172,"publishedAt":37},"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",[],[173,9,108,31,174,175,176,157,177,178],"earthscience stac","how","computer","find","how to","load",{"skillNo":180,"name":181,"nameZh":6,"description":182,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":183,"categories":184,"keywords":185,"publishedAt":37},"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",[],[186,187,108,188,131,154,86,157,91,189,190,191,192,193,194,195,196,197,198,199],"chemistry rdkit","rdkit","search","molecular","similarity","via","calculation","screening","likeness","groups","filtered","Molecules","SMILES","Fingerprints"]