Get started: set up a project
Install the gxmesh CLI, create a Glxymesh project in Go, TypeScript or Python, add a tool, run it locally, deploy it, and connect Claude Code.
This guide takes you from an empty directory to a deployed MCP server that Claude Code can call. You
build one tool, list-open-issues, which lists a GitHub repository’s open issues.
You need:
- A Glxymesh account and a terminal.
- The toolchain for the language you pick: Go, Node.js LTS for TypeScript, or Python 3.14. You need it only to run tools on your machine; the platform builds what you push.
-
Install the CLI
Terminal window curl -fsSL https://platform.glxymesh.com/install.sh | bashTerminal window irm https://platform.glxymesh.com/install.ps1 | iexTerminal window curl -fsSL https://platform.glxymesh.com/install.cmd -o install.cmd && install.cmd && del install.cmdThe binary is called
gxmesh. It keeps itself current withgxmesh update. -
Sign in
Terminal window gxmesh loginThe CLI shows a URL and a code and tries to open the URL in your browser. Enter the code there and approve. This works over SSH too: open the URL on any machine.
-
Create the project
A project is one directory on your machine and one MCP server on Glxymesh. Create it, then pick its language; every code tool in the project uses it.
Terminal window gxmesh org use # pick your organizationgxmesh project create helpdesk # create the project on Glxymeshmkdir acme-helpdesk && cd acme-helpdeskTerminal window gxmesh init --lang node --project helpdesknpm install # fetches @glxymesh/sdkTerminal window gxmesh init --lang go --project helpdeskTerminal window gxmesh init --lang python --project helpdeskinituses the active organization unless you pass--org. It writes:Directoryacme-helpdesk/
- gx.yml the project: org, slug, language, defaults
- package.json packages for every tool, with
@glxymesh/sdk(go.modrequiringglxymesh.com/sdkin Go,requirements.txtin Python) - tsconfig.json TypeScript only (
pyrightconfig.jsonin Python, for your editor) Directorytools/ one folder per tool, empty for now
- …
- .gitignore
gx.yml spec: glxymesh/project@v1org: acmeproject: helpdesklang: nodeserver:title: Acme Helpdeskdescription: Support desk tools for Acme agentsdefaults:timeout: 10smemory: 256MBoutput: jsonserver.titleandserver.descriptionare what MCP clients show when they connect;initleaves them commented out until you fill them in.org,projectandlangare fixed once set. -
Add a tool
Terminal window gxmesh new list-open-issuesThis creates
tools/list-open-issues/with atool.ymland a code file in the project’s language. Replace thetool.ymlwith this:tools/list-open-issues/tool.yml spec: glxymesh/tool@v1name: list-open-issueskind: functiondescription: >Lists open issues in a GitHub repository, newest first.Use it to triage or to see what is broken right now.read_only: trueinputs:owner: {type: string, description: "GitHub user or org, e.g. glxymesh"}repo: {type: string, description: "Repository name, e.g. cli"}limit: {type: integer, default: 20, min: 1, max: 100}output:format: toonas: issuesnetwork:allow: [api.github.com]tests:- input: {owner: golang, repo: go, limit: 2}expect: {rows: 2}The
descriptionis what the model reads to decide when to call the tool, so write it for the model.network.allowlists every host the tool may reach; any other host is refused.Then the code:
tools/list-open-issues/tool.ts import type { Ctx } from '@glxymesh/sdk';import type { Input } from './tool.gen';export async function run(ctx: Ctx, input: Input) {const url = `https://api.github.com/repos/${input.owner}/${input.repo}/issues`;const res = await ctx.fetch(`${url}?state=open&per_page=${input.limit}`);const issues = await res.json();return issues.map((i: any) => ({ number: i.number, title: i.title, author: i.user.login }));}tools/list-open-issues/tool.go package listopenissuesimport ("encoding/json""fmt""glxymesh.com/sdk/glxy")type issue struct {Number int `json:"number"`Title string `json:"title"`User struct {Login string `json:"login"`} `json:"user"`}func Run(ctx *glxy.Ctx, in Input) (any, error) {url := fmt.Sprintf("https://api.github.com/repos/%s/%s/issues?state=open&per_page=%d",in.Owner, in.Repo, in.Limit)res, err := ctx.HTTP().Get(url)if err != nil {return nil, glxy.Errorf("github: %v", err)}defer res.Body.Close()var issues []issueif err := json.NewDecoder(res.Body).Decode(&issues); err != nil {return nil, glxy.Errorf("github: %v", err)}rows := make([]map[string]any, len(issues))for n, i := range issues {rows[n] = map[string]any{"number": i.Number, "title": i.Title, "author": i.User.Login}}return rows, nil}tools/list-open-issues/tool.py from glxymesh import Ctxfrom .tool_gen import Inputdef run(ctx: Ctx, input: Input) -> list[dict]:url = f"https://api.github.com/repos/{input['owner']}/{input['repo']}/issues"res = ctx.fetch(url, params={"state": "open", "per_page": input["limit"]}).raise_for_status()return [{"number": i["number"], "title": i["title"], "author": i["user"]["login"]} for i in res.json()]The
Inputtype is generated frominputs, so a renamed input is a compile error (in Python, a type checker’s), not a runtime one. To reach private repositories, bind a GitHub token toapi.github.com; see Keys and network access. -
Run it on your machine
Call the tool directly:
Terminal window gxmesh call list-open-issues '{"owner":"golang","repo":"go","limit":3}'It builds the project, runs the tool, and prints the answer, its log lines and every request it sent. Run the
tests:from everytool.ymlwithgxmesh test.Local runs apply the same network rules as production: remove
api.github.comfromnetwork.allowand the call fails with the host it tried to reach. See Develop locally. -
Deploy
Terminal window gxmesh pushThis push lets tools reach more than the live version can:host api.github.comApprove? [y/N] y✓ Live · acme/helpdesk r1 · 1 test passedA push that adds a host or a key asks you to approve it first. Later pushes that don’t change hosts or keys go straight through. The platform builds the project, runs the
tests:from yourtool.yml, and makes the revision live only if they pass. -
Connect your client
Terminal window gxmesh connectIt prints your project’s address and client setup instructions. Choose your client below. Replace the example organization and project with the values printed by
gxmesh connect.Terminal window codex mcp add acme-helpdesk --url https://acme.mcp.glxymesh.com/helpdeskcodex mcp login acme-helpdeskcodexApprove the browser sign-in. Inside Codex, run
/mcpto check the tools, then ask it to list the open issues ingolang/go.Terminal window claude mcp add --transport http acme-helpdesk https://acme.mcp.glxymesh.com/helpdeskInside Claude Code, run
/mcp, choose acme-helpdesk → Authenticate, and approve the sign-in page. Then ask Claude: “What are the open issues in golang/go?”For VS Code, Cursor and other clients, follow Connect an MCP client.
Next steps
Section titled “Next steps”- Build tools with AI: describe a tool and let Glxymesh write and test it.
- Tool kinds: tools with no code at all.
- Keys and network access: how keys reach APIs without your code holding them.
- Project layout: every file in a project, for each language.
- Connect other clients: Codex, Claude on the web and desktop, VS Code, Cursor and Windsurf.