{"id":48986736,"url":"https://github.com/whyy9527/ariadne","last_synced_at":"2026-04-18T13:03:43.533Z","repository":{"id":351260997,"uuid":"1210209597","full_name":"whyy9527/ariadne","owner":"whyy9527","description":"Ariadne's thread — a way out of the microservice maze. Local cross-service semantic chain hinter for microservices (GraphQL/HTTP/Kafka/frontend)","archived":false,"fork":false,"pushed_at":"2026-04-14T09:06:18.000Z","size":54,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-14T10:15:48.347Z","etag":null,"topics":["code-navigation","developer-tools","mcp","microservices"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/whyy9527.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-14T07:32:09.000Z","updated_at":"2026-04-14T09:30:13.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/whyy9527/ariadne","commit_stats":null,"previous_names":["whyy9527/ariadne"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/whyy9527/ariadne","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/whyy9527%2Fariadne","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/whyy9527%2Fariadne/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/whyy9527%2Fariadne/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/whyy9527%2Fariadne/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/whyy9527","download_url":"https://codeload.github.com/whyy9527/ariadne/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/whyy9527%2Fariadne/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31969773,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-18T00:39:45.007Z","status":"online","status_checked_at":"2026-04-18T02:00:07.018Z","response_time":103,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["code-navigation","developer-tools","mcp","microservices"],"created_at":"2026-04-18T13:03:42.966Z","updated_at":"2026-04-18T13:03:43.522Z","avatar_url":"https://github.com/whyy9527.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Ariadne\n\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)\n[![MCP](https://img.shields.io/badge/MCP-stdio-8A2BE2)](https://modelcontextprotocol.io)\n[![ariadne MCP server](https://glama.ai/mcp/servers/whyy9527/ariadne/badges/score.svg)](https://glama.ai/mcp/servers/whyy9527/ariadne)\n[![Awesome MCP Servers](https://img.shields.io/badge/Awesome-MCP%20Servers-FC60A8?logo=awesomelists)](https://github.com/punkpeye/awesome-mcp-servers#-developer-tools)\n\n\u003e Ariadne's thread — a way out of the microservice maze.\n\nCross-service API dependency graph for Spring Boot + TypeScript\nmicroservice stacks. MCP stdio server for AI coding assistants\n(Claude Code, Cursor, Windsurf), with a CLI twin. Local SQLite + TF-IDF.\nZero ML dependencies.\n\n![Ariadne demo — scan Spring PetClinic microservices and ask \"owner\"](docs/demo.gif)\n\n---\n\n## What it does\n\nIndexes the *contract layer* — GraphQL mutations, REST endpoints, Kafka\ntopics, frontend queries. Nothing else. That's why results fit an AI\ncontext window.\n\nAsk Claude *\"where does createOrder live across the stack?\"* and\n`query_chains` returns:\n\n```\nTop Cluster #1  [confidence: 0.91]\n  Services: gateway, orders-svc, billing-svc, web\n  - [web]          Frontend Mutation: createOrder\n  - [gateway]      GraphQL Mutation:  createOrder\n  - [orders-svc]   HTTP POST /orders: createOrder\n  - [orders-svc]   Kafka Topic:       order-created\n  - [billing-svc]  Kafka Listener:    order-created → chargeCustomer\n```\n\n~500 tokens round-trip. The equivalent `grep -r createOrder` across\nfour repos returns 40+ matches across DTOs, tests, and configs at\n~2000 tokens, with the contract layer buried.\n\nSupports: GraphQL · Spring HTTP/Kafka/RestClient · TypeScript\nApollo/fetch/axios · Cube.js.\n\n---\n\n## Try it in 30 seconds (zero config)\n\n```bash\npip install ariadne-mcp\nariadne-mcp demo\n```\n\nClones [`spring-petclinic-microservices`][petclinic] into\n`~/.cache/ariadne-mcp/demo`, scans it, and prints the top cluster for\n`owner` — a real cross-service call chain. No config file, no workspace\nsetup.\n\n[petclinic]: https://github.com/spring-petclinic/spring-petclinic-microservices\n\n---\n\n## Install on your own workspace\n\n```bash\npip install ariadne-mcp\ncp \"$(python -c 'import ariadne_mcp, os; print(os.path.join(os.path.dirname(ariadne_mcp.__file__), \"ariadne.config.example.json\"))')\" ariadne.config.json\n# edit ariadne.config.json (list the repos you want indexed)\nariadne-mcp install ariadne.config.json ~/your-workspace\n```\n\nRestart Claude Code. `install` is idempotent — re-run after pulling new\ncode, or let the assistant call `rescan` on a `stale_warning`.\n\n---\n\n## Config\n\n```json\n{ \"repos\": [\n    { \"path\": \"../gateway\" },\n    { \"path\": \"../orders-svc\" },\n    { \"path\": \"../web\" }\n]}\n```\n\nScanners are inferred from each repo's top-level files\n(`pom.xml` / `build.gradle` / `package.json` / SDL). See\n[`docs/CONFIG.md`](docs/CONFIG.md) for the detection table and override\nsyntax.\n\n---\n\n## Try it on a public sample\n\n[`examples/spring-petclinic/`](examples/spring-petclinic/) — clone the\npublic `spring-petclinic-microservices` sample, drop in the config,\nscan, query. Reproducible end-to-end in under a minute.\n\n---\n\n\u003csub\u003eArchitecture, MCP tools, scoring math, feedback boost →\n[`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md). Custom scanners (Go,\nRust, anything) → [`docs/CUSTOM_SCANNERS.md`](docs/CUSTOM_SCANNERS.md).\u003c/sub\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwhyy9527%2Fariadne","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwhyy9527%2Fariadne","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwhyy9527%2Fariadne/lists"}