{"$schema":"https://wellknown.network/schemas/agent-record-v1.json","schemaVersion":"1","id":"ag_ehz44ep3n42q","handle":"pinion-mcp","url":"https://wellknown.network/agents/pinion-mcp","links":{"self":"https://wellknown.network/agents/pinion-mcp/record.json","html":"https://wellknown.network/agents/pinion-mcp","markdown":"https://wellknown.network/agents/pinion-mcp/record.md","api":"https://wellknown.network/api/v1/agents/pinion-mcp","status":"https://wellknown.network/api/v1/agents/pinion-mcp/status","claim":"https://wellknown.network/agents/pinion-mcp/claim","claimApi":"https://wellknown.network/api/v1/claims","claimDescriptor":"https://wellknown.network/agents/pinion-mcp/claim.json","badge":"https://wellknown.network/agents/pinion-mcp/badge.svg","openapi":"https://wellknown.network/openapi.json","history":"https://wellknown.network/api/v1/agents/pinion-mcp/history","tools":"https://wellknown.network/api/v1/agents/pinion-mcp/tools"},"ard":{"identifier":"urn:air::server:pinion-mcp","type":"application/mcp-server-card+json"},"kind":"mcp_server","declared":{"name":"pinion-mcp","summary":"AI-Powered Characterization Test Generator MCP — lock legacy Python behavior into pytest so you can refactor safely.","description":"# Pinion\n\n> **Lock legacy code behavior into pytest — so you can finally refactor it.**\n\n[![License: Apache 2.0](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](LICENSE)\n[![Python 3.11+](https://img.shields.io/badge/python-3.11+-informational.svg)](https://www.python.org/)\n[![MCP](https://img.shields.io/badge/protocol-MCP-7c3aed.svg)](https://modelcontextprotocol.io/)\n[![Tests](https://img.shields.io/badge/tests-112%20passing-success.svg)](#)\n[![PyPI](https://img.shields.io/badge/pypi-coming%20soon-lightgrey.svg)](#)\n\nPinion is an **AI-powered characterization-test generator** that reads a Python function or class method, synthesizes representative inputs, captures the function's actual behavior in a sandbox, and emits a self-contained `pytest` file that locks that behavior in. It runs as a CLI and as a stdio Model Context Protocol (MCP) server, so it works inside Claude Code, Claude Desktop, Cursor, Cline, Codex CLI, Gemini CLI, Zed, `revfactory/harness`, and any other MCP-aware client.\n\n> 🇰🇷 [한국어 README는 여기로 →](README_kr.md)\n> 🇰🇷 [한국어 사용자 매뉴얼은 여기로 →](docs/USER_GUIDE_kr.md)\n\n---\n\n## Why Pinion\n\nLegacy modernization has a chicken-and-egg problem. To refactor safely you need tests. To write tests you need to understand the code. To understand the code you need to refactor it. Most teams stall here for years.\n\nExisting tools have not closed this gap:\n\n- **ApprovalTests / pinning-test libraries** require a human to choose the inputs.\n- **Hypothesis / property-based testing** requires a human to write strategies.\n- **EvoSuite** is Java-only and search-based.\n- **Vendor AI assistants** can suggest tests in chat, but they don't run, validate coverage, or capture real behavior.\n\nPinion treats *input selection* as a reasoning task and gives it to an LLM — then validates the result with deterministic tools (AST analysis, sandboxed execution, `coverage.py`) before emitting a regular `pytest` file you can read, edit, and commit.\n\nThe AI component is essential…","publisher":{"name":"namojo","url":null},"homepage":"https://github.com/namojo/pinion/blob/main/docs/USER_GUIDE.md","repository":"https://github.com/namojo/pinion/releases","version":"0.3.1","license":"Apache-2.0","protocols":["mcp"],"tags":["ai","characterization-tests","legacy","llm","mcp","model-context-protocol","modernization","pytest","testing"],"pricing":null,"endpoints":[{"url":"pypi:pinion-mcp","type":"package_pypi","auth":null,"probeable":false}],"skills":null,"tools":null,"extra":null,"attribution":{"kind":"pypi","name":"pypi","license":"pypi","repoUrl":"pypi","summary":"pypi","version":"pypi","description":"pypi","homepageUrl":"pypi","publisherName":"pypi"}},"derived":{"capabilities":[{"slug":"code.testing","name":"Testing","confidence":1,"provenance":"declared"},{"slug":"dev.package-management","name":"Packages & Dependencies","confidence":0.791,"provenance":"derived"},{"slug":"communication.chat","name":"Team Chat","confidence":0.745,"provenance":"derived"}],"categories":["code","communication","dev"],"language":"en"},"observed":{"status":"unknown","statusReason":"Distributed as a package to run locally; no network endpoint to check.","lastOkAt":null,"lastProbedAt":null,"statusComputedAt":null,"reliability30d":null,"latestObservations":[],"tools":null,"package":{"name":"pinion-mcp","registry":"pypi","observedAt":"2026-11-10T00:24:17.627Z","publishedAt":"2026-05-06T01:36:08.133795Z","latestVersion":"0.3.1"},"toolSurface":null,"endpointFacts":[]},"verification":{"claimed":false,"claimedAt":null,"proofs":[]},"provenance":{"sources":[{"source":"pypi","key":"pinion-mcp","url":"https://pypi.org/project/pinion-mcp/","firstSeenAt":"2026-09-10T09:26:25.999Z","fetchedAt":"2026-11-10T00:22:21.514Z","normalizedAt":"2026-11-10T00:22:21.514Z"}]},"firstSeenAt":"2026-09-10T09:26:25.999Z","updatedAt":"2026-11-10T00:24:17.627Z"}