{"id":51359963,"url":"https://github.com/nbschultz97/cots-catalog","last_synced_at":"2026-07-02T22:34:17.127Z","repository":{"id":328710316,"uuid":"1107610456","full_name":"nbschultz97/cots-catalog","owner":"nbschultz97","description":"COTS robotics and equipment database. Reference library for commercial off-the-shelf drones, UGVs, sensors, and components. Searchable catalog, not a planning tool.","archived":false,"fork":false,"pushed_at":"2026-05-11T03:06:39.000Z","size":121,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-11T04:33:22.032Z","etag":null,"topics":["ai","coa","defense","mission-planning"],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/nbschultz97.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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":"2025-12-01T11:27:18.000Z","updated_at":"2026-05-11T03:06:42.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/nbschultz97/cots-catalog","commit_stats":null,"previous_names":["nbschultz97/mission-architect","nbschultz97/cots-catalog"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/nbschultz97/cots-catalog","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nbschultz97%2Fcots-catalog","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nbschultz97%2Fcots-catalog/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nbschultz97%2Fcots-catalog/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nbschultz97%2Fcots-catalog/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nbschultz97","download_url":"https://codeload.github.com/nbschultz97/cots-catalog/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nbschultz97%2Fcots-catalog/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35065702,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-02T02:00:06.368Z","response_time":173,"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":["ai","coa","defense","mission-planning"],"created_at":"2026-07-02T22:34:15.015Z","updated_at":"2026-07-02T22:34:17.083Z","avatar_url":"https://github.com/nbschultz97.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Architect Companion MCP\n\n[![CI](https://github.com/nbschultz97/cots-catalog/actions/workflows/ci.yml/badge.svg)](https://github.com/nbschultz97/cots-catalog/actions/workflows/ci.yml)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)\n[![Python](https://img.shields.io/badge/python-3.9%2B-blue.svg)](https://www.python.org/)\n[![MCP](https://img.shields.io/badge/MCP-server-purple.svg)](https://modelcontextprotocol.io/)\n\nOffline-first **Model Context Protocol (MCP) server for COTS sUAS / FPV\nbuild planning**. Exposes a curated, manufacturer-sourced parts library\nand a set of compatibility / endurance / blueprint tools so LLM clients\n(Claude Desktop, Claude Code, Cursor, any MCP host) can recommend\nbuilds, sanity-check them, and emit MissionProject v2 stubs — all from\nlocal data, no cloud calls.\n\n**The catalog is hobby / commercial sUAS only.** No military framing,\nno export-controlled parts, no operationally sensitive data.\n\n---\n\n## Table of contents\n\n- [What you get](#what-you-get)\n- [Quickstart](#quickstart)\n- [MCP tools](#mcp-tools)\n- [Wiring into Claude Desktop / Claude Code](#wiring-into-claude-desktop--claude-code)\n- [CLI tools](#cli-tools)\n- [Categories, operation types, compute tiers](#categories-operation-types-compute-tiers)\n- [Bring your own catalog](#bring-your-own-catalog)\n- [Adding parts](#adding-parts)\n- [Examples](#examples)\n- [Known limitations](#known-limitations)\n- [Contributing](#contributing)\n- [License](#license)\n\n---\n\n## What you get\n\n- **10 stdio MCP tools** over a manufacturer-sourced parts library.\n- **80+ COTS parts** across 8 categories (airframes, motors, ESCs,\n  batteries, flight controllers, radios, sensors, accessories) sourced\n  from iFlight, EMAX, T-Motor, RadioMaster, BetaFPV, GEPRC, Holybro,\n  Walksnail, DJI, Tattu, GAONENG, CNHL, Lumenier, Diatone, Happymodel.\n  Every part carries `data_source` provenance.\n- **7 mission presets** covering long-range relay, endurance survey,\n  urban congested-RF, cold-weather, tinywhoop indoor, sub-250g, and\n  beginner 5\". Each conforms to the MissionProject v2 schema.\n- **Self-validating recommender** — calls `check_compatibility` on its\n  own picks so the LLM doesn't have to remember.\n- **JSON Schema validation** of the catalog on load (optional dependency).\n- **Auditable provenance** — every ingested part has `data_source.url`\n  and `data_source.fetched_at`.\n- **No network calls anywhere in the package.** Air-gap friendly.\n\n---\n\n## Quickstart\n\n```bash\n# Install\npip install -e .\n\n# Run the MCP server (blocks on stdio, ready for a client)\narchitect-companion-mcp\n\n# Or just check it works\narchitect-companion-mcp --version\narchitect-companion-mcp --list-tools\narchitect-companion-mcp --diagnostics\n```\n\nRun the tests:\n\n```bash\npip install -e \".[dev]\"\npython -m pytest -q\n```\n\n---\n\n## MCP tools\n\n| Tool | Description |\n|------|-------------|\n| `health` | Server status, version, data dir, catalog counts, available presets and operation types |\n| `list_components` | Browse the parts catalog with filters (category, tag, manufacturer, availability, max_weight_g, max_cost_usd, frequency_band, limit) |\n| `get_part` | Fetch a single part by its catalog ID |\n| `check_compatibility` | Voltage chain, weight budget, mount patterns, motor count / ESC count, KV vs prop, RF-band overlap, ESC vs motor current |\n| `generate_mission_blueprint` | Produce a `MissionProject v2` stub seeded from one of the bundled presets |\n| `estimate_flight_time` | Hover endurance approximation — pass catalog IDs or raw battery / airframe numbers |\n| `recommend_configuration` | Heuristic kit pick for a compute tier + mission type, **self-validates** via `check_compatibility` |\n| `validate_catalog` | Run JSON Schema + uniqueness + required-field checks on the currently loaded library (useful with `ARCHITECT_DATA_DIR`) |\n| `record_observation` | Append-only JSONL telemetry log to local storage |\n\nThe recommender's output now includes a `validation` block with\n`compatible`, `issues`, and `budget` — so the LLM client immediately\nknows whether the picks pass engineering checks.\n\n---\n\n## Wiring into Claude Desktop / Claude Code\n\n### Claude Desktop\n\n`%APPDATA%\\Claude\\claude_desktop_config.json` (Windows) or\n`~/Library/Application Support/Claude/claude_desktop_config.json` (macOS):\n\n```json\n{\n  \"mcpServers\": {\n    \"architect-companion\": {\n      \"command\": \"architect-companion-mcp\"\n    }\n  }\n}\n```\n\n### Claude Code\n\n`.claude/settings.json` (project) or `~/.claude/settings.json` (global):\n\n```json\n{\n  \"mcpServers\": {\n    \"architect-companion\": {\n      \"command\": \"architect-companion-mcp\"\n    }\n  }\n}\n```\n\nRestart the client. The tools appear under the `architect-companion`\nserver.\n\n---\n\n## CLI tools\n\nTwo console scripts ship with the package:\n\n| Command | What it does |\n|---------|--------------|\n| `architect-companion-mcp` | Run the MCP server (stdio). Supports `--version`, `--list-tools`, `--diagnostics`. |\n| `architect-companion-ingest \u003curl\u003e` | Pull a manufacturer product page through the ingester and print the resulting part dict to stdout. JSON-LD → OpenGraph → spec dict fallback. |\n\n---\n\n## Categories, operation types, compute tiers\n\n**Part categories:** `airframes`, `motors`, `escs`, `batteries`,\n`flight_controllers`, `radios`, `sensors`, `accessories`.\n\n**Operation types (for `generate_mission_blueprint`):**\n`long_range`, `long_range_relay`, `relay`, `endurance`,\n`endurance_survey`, `survey`, `mapping`, `urban`, `urban_congested`,\n`race`, `racing`, `cold_weather`, `winter`, `tinywhoop`,\n`tinywhoop_indoor`, `indoor`, `sub_250g`, `recreational`,\n`beginner`, `beginner_5in`, `first_build`. Unknown types fall back to\n`long_range_relay`.\n\n**Mission types (for `recommend_configuration`):** `long_range`,\n`endurance_survey`, `freestyle`, `racing`, `cinematic`, `cold_weather`.\n\n**Compute tiers:** `pi-zero`, `pi4`, `pi5`, `jetson-nano`,\n`jetson-orin-nano`, `x86`. Heavier tiers bias the airframe pick toward\nlarger frames with payload room for the companion compute.\n\n---\n\n## Bring your own catalog\n\nThe bundled `data/` directory is a hobby / COTS FPV reference pack you\ncan use out of the box. Point `ARCHITECT_DATA_DIR` at a different\ndirectory to swap in your own parts library and presets:\n\n```bash\nexport ARCHITECT_DATA_DIR=/path/to/my-catalog\narchitect-companion-mcp\n```\n\nYour custom catalog must conform to the schemas in `data/schema/`. The\n`validate_catalog` MCP tool will tell you exactly what's wrong if a\nload fails.\n\nJSONL telemetry from `record_observation` lands in\n`ARCHITECT_COMPANION_DATA_DIR` (defaults to `./runtime_data`).\n\n---\n\n## Adding parts\n\n```bash\narchitect-companion-ingest https://radiomasterrc.com/products/rp1-expresslrs-2-4ghz-nano-receiver\n```\n\nThree parsers, tried in order:\n\n1. **JSON-LD Product schema** — clean structured extraction. Most\n   Shopify stores ship this.\n2. **OpenGraph meta tags** — falls back when JSON-LD is missing.\n3. **`from_specs()`** — for pages without either, import the module and\n   pass a hand-curated spec dict directly.\n\nEvery ingested entry carries `data_source: {url, fetched_at, parser}`\nso the catalog stays auditable. `_extraction.missing_fields` tells you\nwhat the parser couldn't get; fill those by hand before merging into\n`data/parts_library.json`.\n\n**ToS:** target manufacturer pages, not retailers. See\n[CONTRIBUTING.md](CONTRIBUTING.md) for the full process.\n\n---\n\n## Examples\n\nRunnable scripts in [`examples/`](examples/):\n\n- `recommend_first_build.py` — pick a long-range 7\" kit and show the\n  self-validation report.\n- `check_my_5in.py` — run compatibility checks against a hand-picked\n  5\" build manifest.\n- `long_range_endurance.py` — compare hover endurance across all\n  airframes in the catalog.\n- `ingest_walkthrough.py` — both ingester paths end-to-end.\n\n---\n\n## Known limitations\n\nWhat the compatibility engine **does** catch:\n\n- Battery nominal voltage outside an ESC / FC / motor voltage range.\n- Total component weight exceeding the airframe payload budget (only as\n  accurate as the catalog's `max_payload_g`).\n- Airframe motor_count not matching the number of motor entries (≥2\n  entries treated as explicit per-rotor listing; one entry treated as a\n  spec line).\n- ESC count vs motors — flags missing 4-in-1 or wrong single-ESC count.\n- Motor KV outside the rough band for the airframe's prop size\n  (heuristic FPV builder rule of thumb).\n- Motor / FC / airframe mount-hole pattern mismatch.\n- Control vs video radio frequency-band overlap.\n- ESC max current below motor peak current.\n\nWhat it **does not** catch:\n\n- Battery C-rating vs sustained (not peak) current draw.\n- Frame battery-bay dimensions vs battery dimensions.\n- Antenna polarization (RHCP vs LHCP) between TX and RX.\n- VTX output power legality for the operator's regulatory region.\n- Goggle compatibility with VTX (Analog ↔ Walksnail ↔ DJI ↔ HDZero).\n- Actual thrust headroom or hover stability — see endurance disclaimer.\n\nThe endurance tool is a single-line hover approximation. Forward-flight\nefficiency on long-range and fixed-wing platforms can produce 1.5–2×\nlonger real endurance than the tool reports. Use as a sanity check,\nnot a published spec.\n\n---\n\n## Contributing\n\nWe welcome PRs that add parts, compatibility rules, presets, and\nexamples. See [CONTRIBUTING.md](CONTRIBUTING.md) for the full process,\nincluding data-source expectations and the hobby-marketable scope.\n\nSecurity reports: see [SECURITY.md](SECURITY.md).\nConduct: [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md).\n\n---\n\n## Out of scope (intentionally)\n\n- Live sync with COTS-Architect (just re-vendor `data/`).\n- Mesh routing / link-budget compute — defer to MissionProject planner.\n- Cost roll-ups beyond per-part sums.\n- Regulatory / airspace / NOTAM checks.\n- Flight simulation.\n\n---\n\n## License\n\nMIT — see [LICENSE](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnbschultz97%2Fcots-catalog","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnbschultz97%2Fcots-catalog","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnbschultz97%2Fcots-catalog/lists"}