MCP Server Builder
shareAI-lab/learn-claude-code
Walks through building MCP servers in Python or TypeScript that expose tools, resources and prompts to Claude, with templates, registration and testing.
First steps for using a Malloy Publisher deployment through its MCP tools.
$ npx skills add malloydata/publisher --skill malloy-getting-started -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install malloydata/publisher malloy-getting-started --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/malloydata/publisher.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/malloy-getting-started .claude/skills/malloy-getting-started && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "malloy-getting-started" agent skill from https://github.com/malloydata/publisher/tree/main/skills/malloy-getting-started into .claude/skills/malloy-getting-started/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "malloy-getting-started", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/malloydata/publisher/tree/main/skills/malloy-getting-startedType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add malloydata/publisher --skill malloy-getting-started -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install malloydata/publisher malloy-getting-started --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/malloydata/publisher.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/malloy-getting-started .agents/skills/malloy-getting-started && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "malloy-getting-started" agent skill from https://github.com/malloydata/publisher/tree/main/skills/malloy-getting-started into .agents/skills/malloy-getting-started/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "malloy-getting-started", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add malloydata/publisher --skill malloy-getting-started -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install malloydata/publisher malloy-getting-started --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/malloydata/publisher.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/malloy-getting-started .cursor/skills/malloy-getting-started && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "malloy-getting-started" agent skill from https://github.com/malloydata/publisher/tree/main/skills/malloy-getting-started into .cursor/skills/malloy-getting-started/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "malloy-getting-started", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/malloydata/publisher.git --path skills/malloy-getting-started--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add malloydata/publisher --skill malloy-getting-started -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install malloydata/publisher malloy-getting-started --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/malloydata/publisher.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/malloy-getting-started .gemini/skills/malloy-getting-started && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "malloy-getting-started" agent skill from https://github.com/malloydata/publisher/tree/main/skills/malloy-getting-started into .gemini/skills/malloy-getting-started/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "malloy-getting-started", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install malloydata/publisher malloy-getting-startedInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add malloydata/publisher --skill malloy-getting-started -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/malloydata/publisher.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/malloy-getting-started .github/skills/malloy-getting-started && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "malloy-getting-started" agent skill from https://github.com/malloydata/publisher/tree/main/skills/malloy-getting-started into .github/skills/malloy-getting-started/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "malloy-getting-started", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add malloydata/publisher --skill malloy-getting-started -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install malloydata/publisher malloy-getting-started --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/malloydata/publisher.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/malloy-getting-started .opencode/skills/malloy-getting-started && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "malloy-getting-started" agent skill from https://github.com/malloydata/publisher/tree/main/skills/malloy-getting-started into .opencode/skills/malloy-getting-started/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "malloy-getting-started", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
malloy-getting-startedFirst steps for using a Malloy Publisher deployment through its MCP tools.
Malloy Getting Started is an agent skill from malloydata/publisher. First steps for using a Malloy Publisher deployment through its MCP tools. Use when connecting to Publisher for the first time, when you do not yet know the available environments, packages, or models, or when a user asks what data they can explore. Also use for "malloy help" or which Malloy skill to read. Covers verifying the server, discovering data with getcontext, and running a first grounded query.
Its SKILL.md is about 4k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Agent Workflows, covering MCP servers. It works with npm. The repository describes itself as: Publisher is the open-source analytics engine for Malloy. It lets you define data models once — and use them everywhere. The licence is MIT.
5 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 39a546f. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
npmnpxbuncurlclaudeFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use npm, npx and curl, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Malloy Getting Started loads about 4k tokens when it runs. Until then it costs about 108 tokens; SKILL.md has 2,287 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from malloydata/publisher at commit 39a546f, republished under its MIT licence (© malloydata). 2,287 words, ~3,962 tokens.
.claude/skills/malloy-getting-started/SKILL.md (or your agent's skills folder).<!--
Copyright (c) Credible Data Inc.
SPDX-License-Identifier: MIT
-->
Goal: go from "connected" to a correct, grounded answer without guessing any names.
If you are reading this from a URL and have a shell, run npx -y @malloy-publisher/skills@latest install to put every Malloy skill on disk, reference/ files included, so the skills named below are there when you need them. It needs no server. Keep the @latest: without it npx may reuse an old cached copy. If it cannot tell which agent you are, it says so; name one (install claude or install agents).
At minimum you need get_context, list_packages, execute_query, and search_malloy_docs. Authoring a model also needs compile_model and reload_package (see section 4); an older Publisher may not serve those two.
If none of the tools are there, either the server is not running or your client connected before it was. Start the server (npx @malloy-publisher/server --port 4000, or bun run build && bun run start from a clone) and wait until curl -s http://localhost:4000/api/v0/status reports operationalState: serving. If the point is to author models against a local package, add --watch-env <env>: without it Publisher copies local packages at boot and serves the copies, so saved edits are never read.
If there is no Publisher workspace here at all, and the user wants to work with data of their own rather than the bundled examples, npm create @malloy-publisher/malloy-package@latest <name> scaffolds one: the package and a starter model, registered so the server actually serves it, plus the start script, the MCP config and these skills. Keep the @latest when you type it: npm create resolves through npm's npx cache and an unversioned name is satisfied by any copy already there, so on a machine that has scaffolded before npm never asks the registry and you get an old scaffolder pinning an old server, with nothing to say so. Run bare, it comes with a small sample dataset, so there is something to query straight away. In a fresh directory npm start then runs the pinned server against the package in watch mode; if the directory already had a package.json the scaffolder leaves it alone and adds no script, printing the equivalent npx command to use instead. Where you run it matters: only the package lands in <name>/, and the workspace files, the agent instructions and the MCP config among them, are written to the current directory. Run it here if this directory is empty or is meant to become the workspace. If it already holds other work, scaffold into a new directory instead (mkdir my-data && cd my-data), because agent config is discovered by walking up, so writing those files here changes what every session beneath this directory inherits. Seed the starter model from a local file with npm create @malloy-publisher/malloy-package@latest <name> -- --data <path/to/their-file.csv> (CSV, Parquet, or Excel .xlsx), keeping the --, which is how npm create passes options through. That path is relative to wherever you run the command, so if you scaffolded into a new directory it has to reach back out to their file; the scaffolder copies it into the package and leaves the original alone. A seeded package starts smaller than the sample one, since the scaffolder does not read their columns: expect a row count and an overview, and build the model from there. A package is just Malloy, so it can instead query a database connection the config defines. Because it writes a .mcp.json that did not exist when the client connected, the user has to restart or reconnect once before these tools appear, and their client will ask them to approve the new project-scoped server the first time. That only works when the workspace is at the session's own root, so if you scaffolded into a new directory below that root, the user has to open a session there instead: a .mcp.json further down is never discovered.
If you started the server yourself in this session, the tools still will not appear: your tool list was fixed when you connected, and you cannot reconnect yourself. Tell the user the tools are missing for that reason and ask them to run /mcp, select malloy, and choose Reconnect. The panel offers Authenticate first and reports Auth: not authenticated; that is a red herring, the endpoint has no auth. Restarting Claude Code also works. Continue once the tools are there.
Two escape hatches worth knowing:
.mcp.json is only discovered by sessions that start in its directory), register the server at user scope so the directory stops mattering: claude mcp add --transport http malloy http://localhost:4040/mcp -s user (use the MCP port the server actually bound; its startup log prints it). Caveat: for sessions that do start in the workspace, the project .mcp.json shadows the user-scoped entry, so prefer the project file when it is discoverable..mcp.json's URL blindly. The file outlives the server that wrote it, and a boot that failed partway (for example, the REST port was taken) can leave it pointing at a dead port while a live server sits on another. If connecting fails or answers look wrong, confirm identity with list_packages, which names the environment and packages you are really talking to; that check works on every platform, which the port check does not (lsof -iTCP:4040 -sTCP:LISTEN on macOS and Linux, netstat -ano | findstr :4040 on Windows).When a user is present, do not route around it by calling the REST API with curl. It appears to work, so the user never learns their session is missing the tools, and you lose what they are for: grounded discovery instead of guessed names, compile_model instead of throwaway queries, and reload_package instead of a restart. Say the tools are missing and let the user fix it in five seconds. Running unattended, with nobody who can reconnect you, is different: there the REST API is the supported interface, not a workaround. Discovery, query, compile, and reload all have REST equivalents (search_malloy_docs and get_context's plain-English ranking do not; read the bundled skills for syntax and ground from model metadata instead); the running server serves the full spec at http://localhost:4000/api-doc.yaml, and AGENTS.md carries the endpoint map.
Publisher is often not the only thing reading the model. The Malloy CLI (malloy-cli) and the VS
Code extension compile the same files, and they do not get their connections from
publisher.config.json - they read malloy-config.json, found by walking up from the file being
compiled. So a package that Publisher serves correctly can fail to compile in the editor, on the
same machine, from the same files.
Ask before the user finds out the hard way:
Are you also using the Malloy CLI or the VS Code extension on this package?
If yes, and the package reads local data files, it needs a malloy-config.json. Publisher
resolves a relative duckdb.table('data/x.csv') against the package root on its own, so nothing is
configured for it; the other two hosts resolve it against the DuckDB connection's
workingDirectory, which has to be set.
Make that path absolute. A relative workingDirectory is resolved against the process's current
directory, not the config file's directory and not the VS Code workspace root, so the same config
compiles from one directory and fails from another:
// malloy-config.json, beside the model
{
"connections": {
"duckdb": {
"is": "duckdb",
"workingDirectory": "/abs/path/to/package",
"securityPolicy": "none"
}
}
}Point it at the directory the model's table paths are written relative to - the one holding data/.
Leave the model's own paths relative so Publisher still serves it; only the config carries the
absolute path. When this is wrong the editor reports IO Error: No files found that match the pattern "data/x.csv" on the source: line, followed by a "not defined" error for every field of
that source; those are cascade, not real. The malloy-gotchas-modeling skill covers the mechanism
under § Relative Data-File Paths.
Remote Credible connections are a different case. With the Credible extension running and signed
in, the data is reached through a publisher proxy connection - the connection type that forwards
SQL to a remote Publisher dataplane, and the same type the CLI and the VS Code extensions use - and
the extension supplies it, so there is nothing to hand-write and no workingDirectory involved.
workingDirectory only ever matters for local files that DuckDB opens itself. Worth knowing: those
access tokens are user-scoped and short-lived, and nothing refreshes them mid-session, so queries
that start failing auth after a long session mean the token expired, not that the model broke. See
docs/connections.md § Publisher proxy connections.
Two tools, in this order.
list_packages takes no arguments and returns every environment with its packages. That is where the environment and package names come from. It is also the only place a package that failed to load shows up, with the reason; a package missing from a plain listing looks like one that does not exist.
get_context retrieves against one package. Give it a search_targets entry per concept the question needs, and a scopes entry naming the environment and package:
{
"search_targets": [
{"target_type": "measure", "search_text": "total revenue"},
{"target_type": "dimension", "search_text": "the product category"}
],
"scopes": [{"environment": "examples", "package": "storefront"}]
}One call answers. The response groups the fields that matched under the sources holding them, so describing the fields is the whole search: there is no second call to drill into a source. Two variations are worth knowing:
search_text to enumerate that type instead of ranking it. A lone {"target_type": "source"} is the catalog browse, which returns a thin card per source (a one-line summary rather than the full doc) and pages with offset and next_offset.source to the scope to narrow to one source, which is also how to read that source's full doc after a browse.scopes is required and takes exactly one entry, because retrieval is indexed per package.
Use the names it returns exactly. Do not invent environments, packages, sources, or fields. A field reached through a join is named by its full dotted path; pass it verbatim rather than rebuilding it.
A retrieval response is a sources array. Each entry's source_info.resource_id carries environment, package, and model_path; pass them to execute_query as environmentName, packageName, and modelPath, plus either:
name as queryName (with the card's resource_id.source as sourceName for a view), orquery.The result is JSON. Charts and dashboards defined in the model render in the Publisher UI at http://localhost:4000.
Use search_malloy_docs for language questions (filters, aggregates, joins, nesting, renderers).
If the data you want is in a connected database but not yet in any package, use search_database_schema instead of get_context: it walks a connection's schemas and tables and ranks them against a plain-English description, and hands back the source: line to start a model from. It returns names and types only, so to see what a column actually contains run execute_query against a model in a package that uses the same connection, with an ad-hoc query like run: my_conn.table('sales.orders') -> { group_by: order_status }. That tool needs an existing model to run against, so a table you have not modelled yet has none of its own.
Answering questions is the start, not the whole surface. When the user asks what is possible, say so rather than offering queries alone. Switch skills for the deeper work:
malloy-modeling: build or change a model. Validate the edit with compile_model, save it, then reload_package so the new sources and views run by name without restarting the server.malloy-analysis: explore a package and answer data questions.malloy-html-data-apps: build a data app, a hand-authored HTML page in the package's public/ directory that Publisher serves, backed by the package's models and needing no build step.malloy-review: check Malloy for correctness.No .malloy files in the workspace? The user can say "model my data" and malloy-modeling runs the whole workflow (discover, scope, define, build, review, curate). Check the Publisher MCP tools are configured first.
This is a catalogue of what exists, not of what is loaded. A host that installs one group (analysis, modeling or eval) takes that group's skills alone, so a name below may not be installed. The names are plain text, not skill: references, for that reason.
malloy-analysis (a data question, or open-ended exploration), malloy-phrase-detection (turn a question into search targets for get_context), malloy-queries (query syntax and compile errors), malloy-charts (chart choice, renderer tags, scale rules), malloy-notebooks (notebooks), malloy-analysis-report (combine queries you already ran into a report), malloy-dashboards (a saved dashboard: a tagged .malloy file in the package's dashboards/ directory), malloy-source-unreachable (a source missing from discovery, or a query refused with a 404 or 403), malloy-html-data-apps (in-package HTML data apps: design, runtime, embedding).malloy-modeling (the driver), malloy-discover (silent data discovery, prior art), malloy-define (scope, source plan, field definitions), malloy-model (write and curate the .malloy files), malloy-document (#(doc) tags), malloy-model-as-you-go (grow the model from answered questions), malloy-gotchas-modeling (mistakes to avoid, and fixing compile errors in a model), malloy-review (review existing Malloy), malloy-lookml-review and malloy-powerbi-review (prior-art adapters).malloy-publish (move a finished model into a served package), malloy-materialization (persist an expensive source, and tune what to persist and when).eval group, which neither analysis nor modeling includes): eval-loop (the loop), eval-answer, eval-judge, eval-diagnose, eval-improve, eval-import, eval-report.get_context results. If a name is not in the results, do not use it.list_packages and the catalog browse are for finding a name you are missing, not steps to walk first.© malloydata, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in skills/malloy-getting-started of malloydata/publisher.
Open the folder on GitHubat commit 39a546f
Malloy Getting Started next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Malloy Getting Started this skillmalloydata/publisher | 116 | — | ~4k | Automated safety check: Pass | MIT | |
| MCP Server BuildershareAI-lab/learn-claude-code | 78k | 5 repos | ~1.2k | Automated safety check: Pass | MIT | |
| Yahoo Finance2gadicc/yahoo-finance2 | 801 | — | ~1.8k | Automated safety check: Pass | MIT | |
| Workflow Schema Tuningbreaking-brake/cc-wf-studio | 5.4k | — | ~1.3k | Automated safety check: Pass | Custom licence | |
| Paseo Plugin Buildergetpaseo/paseo | 20k | — | ~9.4k | Automated safety check: Pass | Custom licence | |
| Context Mode Doctormksglu/context-mode | 26k | — | ~262 | Automated safety check: Pass | Custom licence |
shareAI-lab/learn-claude-code
Walks through building MCP servers in Python or TypeScript that expose tools, resources and prompts to Claude, with templates, registration and testing.
gadicc/yahoo-finance2
A skill your agent uses when building with the yahoo-finance2 TypeScript/Deno/npm library, using its Yahoo Finance data modules, CLI, or MCP server, or contributing to the yahoo-finance2 repository…
breaking-brake/cc-wf-studio
Guides edits to cc-wf-studio's workflow schema so AI agents generate better workflows, treating schema text as prompt engineering rather than validation.
getpaseo/paseo
Builds, installs and troubleshoots trusted local Paseo plugins, from lifecycle hooks and slash commands to screens, themes and timeline renderers.
mksglu/context-mode
Run context-mode diagnostics. Checks runtimes, hooks, FTS5, plugin registration, npm and marketplace versions. Trigger: /context-mode:ctx-doctor
ruvnet/ruflo
Sets up and drives Ruflo, an npm-installed orchestration layer for multi-agent swarms, persistent memory, routing, hooks and its MCP tool catalog.
malloydata/publisher
Score one analytical answer against a verified golden, and score which of the entities the golden depends on retrieval delivered to the answerer.
malloydata/publisher
Fix a CRITICAL Trivy finding that is failing CI in this repo (a vulnerability, misconfiguration, or secret from security-scan.yml or image-scan.yml), or add, review, or retire an entry in…
malloydata/publisher
Turn a list of questions into an eval set, whatever shape it arrived in: a JSONL a customer sent, a CSV, a spreadsheet export, a markdown doc, an email thread, or a pull from production logs.
malloydata/publisher
Conduct a local Publisher evaluation loop in five steps: scrape/run, eval, diagnose, improve, checkpoint.
malloydata/publisher
Make the smallest safe Malloy model edit that closes a diagnosed model-owned gap, with a probe receipt for every factual claim.
malloydata/publisher
Decide whether ONE answer matches its golden, and say whether you believe the golden.
Works with
Categories
First steps for using a Malloy Publisher deployment through its MCP tools. Malloy Getting Started is an agent skill from malloydata/publisher. First steps for using a Malloy Publisher deployment through its MCP tools.
Malloy Getting Started fits situations like: connecting to Publisher for the first time; you do not yet know the available environments; A user asks what data they can explore; which Malloy skill to read.
Run `npx skills add malloydata/publisher --skill malloy-getting-started -a claude-code`. Or copy the skill folder (skills/malloy-getting-started in malloydata/publisher) into .claude/skills/malloy-getting-started in your project. Claude Code loads it when a task matches its description.
Run `npx skills add malloydata/publisher --skill malloy-getting-started -a codex`. Or copy the skill folder (skills/malloy-getting-started in malloydata/publisher) into .agents/skills/malloy-getting-started in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add malloydata/publisher --skill malloy-getting-started -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/malloy-getting-started, .gemini/skills/malloy-getting-started, .github/skills/malloy-getting-started and .opencode/skills/malloy-getting-started in your project.
Going by SKILL.md and its folder, Malloy Getting Started needs the command-line tools its instructions call (npm, npx, bun, curl and claude). Our summary lists: Node.js.
SKILL.md contains no URLs. Its commands use npm, npx and curl, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Malloy Getting Started is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 4k tokens (SKILL.md is roughly 16k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Malloy Getting Started: MCP Server Builder (shareAI-lab/learn-claude-code, 78k stars), Yahoo Finance2 (gadicc/yahoo-finance2, 801 stars), Workflow Schema Tuning (breaking-brake/cc-wf-studio, 5.4k stars) and Paseo Plugin Builder (getpaseo/paseo, 20k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
malloydata (a GitHub organization) maintains it in malloydata/publisher, which has 116 GitHub stars. The repository holds 29 skills in this directory. The repository was last updated on October 8, 2026.
Source: malloydata/publisher on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.