If you've used an AI coding agent for a while, you've probably seen this: each library on its own looks fine, but the code that glues two of them together doesn't run.
That's usually not the agent being dumb. It's version drift.
Where it breaks
Models learn from years of code written against many versions of each library. When a task touches two or three libraries at once, the agent has to pick an API for each one, and it often mixes versions that never worked together.
A simple example: in Pydantic v1 you imported BaseSettings from pydantic. In Pydantic v2 it moved to a separate package, pydantic-settings, and config moved from an inner class Config to model_config = SettingsConfigDict(...). An agent that blends the two gives you code that looks right and fails on import or ignores your settings.
Same story across a lot of stacks: auth libs and web frameworks, ORMs and migration tools, SDKs and their mocking libraries.
What helps: pinned, tested recipes
ProvenPin is a free MCP server with multi-library code recipes. Each recipe:
- pins exact versions of every library it uses
- ships with tests
- gets run in CI, and carries a receipt showing when it last passed
So instead of guessing, your agent pulls code that is known to work with a known set of versions.
A real recipe
Here's the pydantic-settings-config recipe. Pins:
pydantic==2.14.1
pydantic-settings==2.16.0
pytest==9.1.1
settings.py:
from pydantic import BaseModel, Field, SecretStr
from pydantic_settings import BaseSettings, SettingsConfigDict
class DbSettings(BaseModel):
url: str = "sqlite:///app.db"
pool_size: int = Field(5, ge=1, le=50)
class Settings(BaseSettings):
model_config = SettingsConfigDict(env_prefix="APP_", env_nested_delimiter="__", env_file=".env", extra="ignore")
debug: bool = False
api_key: SecretStr
db: DbSettings = DbSettings()
Its receipt: 3 tests passed, 0 failed, on Python 3.13 in GitHub Actions, last passed Oct 15, 2026. You can see it here: https://provenpin.com/recipes/pydantic-settings-config/
Connect it
No signup, no key. Add this to your MCP client config (Claude Desktop, Cursor, etc.):
{
"mcpServers": {
"provenpin": {
"url": "https://mcp.provenpin.com/mcp"
}
}
}
Or in Claude Code:
claude mcp add --transport http provenpin https://mcp.provenpin.com/mcp
There are 84 recipes live right now across Python and JS, and we're adding more. If there's a combo of libraries your agent keeps getting wrong, tell us in the comments and we'll look at it.
Top comments (0)