Lovie MCP›OpenAI API
API
The Responses API takes a remote MCP server as a tool. It is not an interactive OAuth client, so unlike every other client on this page you supply the access token yourself.
The only value you need
https://mcp.lovie.co/mcp
A remote MCP server is one entry in tools. The model discovers the tool list
itself; you only name the server.
{
"type": "mcp",
"server_label": "lovie",
"server_url": "https://mcp.lovie.co/mcp",
"server_description": "Banking, cap table, accounting and US company formation.",
"require_approval": "always",
"authorization": "<lovie access token>"
}
| Field | Meaning |
|---|---|
| server_url | The endpoint. A custom server always uses this; connector_id is only for OpenAI’s own hosted connectors. |
| server_label | How the model refers to the server in its output. |
| require_approval | "always" pauses for your confirmation before each call. Use "never" only once you trust the flow. |
| allowed_tools | Optional allowlist. Narrowing the surface improves tool choice and blast radius. |
| authorization | The OAuth access token. The API does not store it — send it on every request. |
Every other client on this site runs the OAuth flow for you. The Responses API is not
an interactive client — there is no browser to open — so you obtain an access
token once and pass it in authorization.
brew install lovieco/tap/lovie — or see https://cli.lovie.co.lovie auth login and complete the sign-in in your browser.# macOS jq -r '.credentials[] | select(.endpoint=="https://mcp.lovie.co/mcp") | .accessToken' \ ~/Library/Application\ Support/lovie/credentials.json # Linux jq -r '.credentials[] | select(.endpoint=="https://mcp.lovie.co/mcp") | .accessToken' \ ~/.config/lovie/credentials.json
Tokens expire. lovie auth login refreshes them, so read the value at request
time rather than baking it into an image or a committed .env.
import os from openai import OpenAI client = OpenAI() resp = client.responses.create( model="gpt-5.6", tools=[{ "type": "mcp", "server_label": "lovie", "server_url": "https://mcp.lovie.co/mcp", "server_description": "Banking, cap table, accounting and US company formation.", "require_approval": "always", "authorization": os.environ["LOVIE_ACCESS_TOKEN"], }], input="What is my cap table?", ) print(resp.output_text)
import OpenAI from "openai"; const client = new OpenAI(); const resp = await client.responses.create({ model: "gpt-5.6", tools: [{ type: "mcp", server_label: "lovie", server_url: "https://mcp.lovie.co/mcp", server_description: "Banking, cap table, accounting and US company formation.", require_approval: "always", authorization: process.env.LOVIE_ACCESS_TOKEN, }], input: "What is my cap table?", }); console.log(resp.output_text);
Omit authorization and the connection still works: discovery is anonymous and
the open tools answer. Anything that touches a company returns an authorization challenge
instead of data, which is a reasonable way to explore the tool surface before wiring
credentials.
| Symptom | Cause |
|---|---|
| Tools listed, every call refused | No token, an expired one, or it was dropped — the API keeps nothing, so it must be on every request. |
| The model picks the wrong tool | Set allowed_tools to the handful the task needs. |
| Approvals on every step | Expected under "always". Move to "never" only for flows you have watched end to end. |
| Empty tool list | server_url is missing the /mcp path. |