qbo-mcp
QuickBooks Online을 위한 Model Context Protocol 서버입니다. 5분 안에 Claude를 귀하의 장부(고객, 공급업체, 송장, 청구서 및 계정과목표)에 읽기 전용으로 연결하세요.
👁 License: MIT
👁 Python 3.10+
👁 MCP
이 서버의 존재 이유
약 700만 개의 기업이 QuickBooks Online(QBO)을 사용하여 장부를 관리합니다. Intuit는 유능한 REST API를 제공하지만 공식 MCP 서버는 없기 때문에, Claude(또는 MCP를 지원하는 AI 어시스턴트)가 장부를 확인하기를 원하는 모든 팀은 매번 OAuth와 페이지네이션 처리를 처음부터 직접 구현해야 합니다.
만약 Claude를 사용하여 일상적인 재무 업무(미수금 추적, 매입채무 확인, 이사회 보고 준비 등)를 처리한다면, 이러한 격차는 "3월 말에 Acme가 우리에게 얼마를 빚지고 있었지?"라는 질문이 즉시 작동하는 것과, 커스텀 통합이 필요한 것 사이의 차이를 만듭니다.
qbo-mcp는 그 격차를 해소합니다. 이 서버는 8개의 읽기 전용 QBO 엔드포인트를 모든 MCP 클라이언트에 노출하는 작고 잘 테스트된 MIT 라이선스 MCP 서버입니다. 실제 자금 흐름에 대해 수년간 QBO 자동화를 운영하며 얻은 경험을 바탕으로, 프로덕션 환경에서 발생하는 모든 문제(토큰 갱신, 429 제한, 페이지 중간 만료, 쿼리 문자열 이스케이프 등)를 client.py에서 처리하므로 직접 고생할 필요가 없습니다.
Related MCP server: QuickBooks MCP Server
활용 방법
이 서버를 Claude Code, Claude Desktop 또는 모든 MCP 호스트에 연결한 후 다음과 같이 질문해 보세요:
"'Acme'와 일치하는 모든 고객을 찾아 잔액을 보여줘."
"지금 WidgetCo에 우리가 얼마를 빚지고 있지? 미결제 청구서 목록을 보여줘."
"이번 달에 생성된 모든 미납 송장을 가져와서 고객별로 그룹화해줘."
"계정과목표는 어떻게 구성되어 있지? 모든 은행 및 기타 유동 자산 계정과 현재 잔액을 나열해줘."
"지난주 청구서 발행량과 지난달 같은 주를 비교해줘."
Claude가 귀하의 장부를 직접 읽습니다. 복사-붙여넣기, 스프레드시트, 커스텀 파이프라인이 필요 없습니다.
도구 (v0.1, 모두 읽기 전용)
도구 | 기능 |
| 표시 이름으로 고객 찾기 (부분 일치, 대소문자 구분 안 함). |
| ID로 고객 한 명 가져오기. |
| 표시 이름으로 공급업체 찾기. |
| ID로 공급업체 한 명 가져오기. |
| 날짜 범위 내 송장 나열 (선택적으로 미결제/결제 완료 필터링). |
| 라인 항목을 포함하여 ID로 송장 한 개 가져오기. |
| 날짜 범위 내 청구서 나열 (선택적으로 미결제/결제 완료 필터링). |
| 잔액이 포함된 활성 계정과목표 반환. |
쓰기 엔드포인트(송장 생성, 청구서 생성, 분개장 입력)는 의도적으로 v0.1에 포함되지 않았습니다. 읽기 전용 기능이 안정화된 후 v0.2에서 계획될 예정입니다. 읽기 기능이 충분히 검증될 때까지 장부에 직접 쓰기 작업을 수행하는 도구는 배포하지 않을 것입니다.
설치
pip install qbo-mcpv0.1은 이 저장소에서 제공됩니다. PyPI 배포는 대기 중입니다. 현재는
pip install git+https://github.com/alveyautomation/qbo-mcp를 사용하거나 로컬에서 클론 후pip install -e .를 실행하여 설치하세요.
일회성 OAuth 설정
QBO는 갱신 토큰(refresh token)이 순환되는 OAuth 2.0을 사용합니다. 이 과정은 한 번만 수행하면 되며, 그 후 qbo-mcp는 (최소 100일에 한 번 실행되는 한) 영구적으로 인증 상태를 유지합니다. 총 소요 시간: 약 60초.
https://developer.intuit.com/에서 앱을 생성합니다. Accounting 범위를 선택하세요.
client_id와client_secret을 복사합니다.https://developer.intuit.com/app/developer/playground에서 OAuth Playground를 방문합니다. 앱을 선택하고 환경(Sandbox 또는 Production)을 선택한 후 Get Authorization Code를 클릭합니다. 연결하려는 QuickBooks 회사 계정으로 로그인합니다.
코드를 토큰으로 교환합니다(Playground가 자동으로 수행합니다). 다음을 복사하세요:
refresh_token(긴 문자열, 100일 동안 비활성 상태 유지)realmId(숫자, QBO 회사를 식별)
.env파일에 저장합니다:
QBO_CLIENT_ID=ABxxxxxxxxxxxxxx
QBO_CLIENT_SECRET=xxxxxxxxxxxxxxxx
QBO_REFRESH_TOKEN=ABxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
QBO_REALM_ID=1234567890123456
QBO_ENVIRONMENT=production # or "sandbox"이것으로 끝입니다. 첫 번째 도구 호출 시 갱신 토큰이 액세스 토큰으로 교환되며, 이후 호출은 액세스 토큰이 만료될 때까지(~55분) 캐시된 토큰을 재사용하고, 만료 시 클라이언트가 자동으로 갱신합니다.
갱신 토큰 순환: Intuit는 갱신할 때마다 새로운 갱신 토큰을 발행하고 이전 토큰을 즉시 무효화합니다. 배포 환경이 단일 장기 실행 프로세스라면 이 과정은 보이지 않게 처리됩니다. 배포가 자주 재시작되는 환경(컨테이너, 서버리스)이라면 순환된 토큰을 영구 저장해야 합니다.
QBOClient(on_refresh_token_rotated=...)를 구독하여 모든 순환을 캡처하세요. 자세한 내용은 SECURITY.md를 참조하세요.
Claude Code에 연결
~/.claude/claude_code_config.json(또는 프로젝트의 MCP 설정)에 추가하세요:
{
"mcpServers": {
"qbo": {
"command": "qbo-mcp",
"env": {
"QBO_CLIENT_ID": "ABxxxxxxxxxxxxxx",
"QBO_CLIENT_SECRET": "xxxxxxxxxxxxxxxx",
"QBO_REFRESH_TOKEN": "ABxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"QBO_REALM_ID": "1234567890123456",
"QBO_ENVIRONMENT": "production"
}
}
}
}Claude Code를 재시작합니다. 새로운 세션에서 8개의 qbo_* 도구가 나타납니다.
Claude Desktop에 연결
~/Library/Application Support/Claude/claude_desktop_config.json(macOS) 또는 %APPDATA%\Claude\claude_desktop_config.json(Windows)을 편집하고 위와 동일한 mcpServers 블록을 추가합니다. 데스크톱 앱을 재시작하세요.
도구 참조
모든 도구는 JSON 봉투를 반환합니다:
{ "ok": true, "data": { ... } }
{ "ok": false, "error": "human-readable message" }qbo_search_customers
qbo_search_customers(query: str, limit: int = 50)Customer.DisplayName에 대한 부분 일치 검색입니다. 쿼리는 QBO의 쿼리 언어에 포함되기 전에 이스케이프 처리되므로 아포스트로피(O'Brien)와 밑줄(acme_test)은 안전합니다.
예시 응답:
{
"ok": true,
"data": {
"customers": [
{ "Id": "1001", "DisplayName": "Acme Corp", "Balance": 1250.00 }
],
"count": 1,
"query": "acme",
"limit": 50
}
}qbo_get_customer
qbo_get_customer(customer_id: str)Id로 전체 고객 레코드를 가져옵니다. ID가 존재하지 않으면(404) data: null을 반환합니다.
qbo_search_vendors / qbo_get_vendor
고객 쌍과 대칭적이며 Vendor 엔티티를 대상으로 합니다.
qbo_search_invoices
qbo_search_invoices(
date_from: str, # ISO date "YYYY-MM-DD"
date_to: str, # ISO date "YYYY-MM-DD"
status: str | None = None, # "open" | "paid" | None
limit: int = 200, # max 2000
)범위는 Invoice.TxnDate를 포함합니다. status 필터는 QBO의 Balance 필드에 대한 편의 기능입니다. "open"은 Balance > 0인 송장을, "paid"는 Balance = 0인 송장을 반환합니다.
페이지네이션은 투명하게 처리됩니다. QBO의 쿼리 엔드포인트는 명시적인 STARTPOSITION / MAXRESULTS 절을 요구하며, 클라이언트는 limit에 도달하거나 업스트림이 짧은 페이지를 반환할 때까지 페이지를 순회합니다. limit이 중단 조건이었을 경우 응답에 limit_reached: true가 포함됩니다.
qbo_get_invoice
qbo_get_invoice(invoice_id: str)전체 송장 레코드(Line[] 포함)를 반환하거나, 404인 경우 data: null을 반환합니다.
qbo_search_bills / qbo_get_invoice 패리티
qbo_search_bills는 qbo_search_invoices와 동일하지만 Bill 엔티티(공급업체 측)를 대상으로 합니다. 동일한 날짜 의미론과 상태 필터를 사용합니다.
qbo_get_chart_of_accounts
qbo_get_chart_of_accounts()영역 내의 모든 활성 계정을 반환합니다. 각 레코드에는 Id, Name, AccountType, AccountSubType, Classification, CurrentBalance 및 기타 QBO 필드가 포함됩니다. "이 거래가 어디에 게시되었는가?"와 같은 질문의 근거를 찾는 데 유용합니다.
로컬 개발
git clone https://github.com/alveyautomation/qbo-mcp
cd qbo-mcp
python -m venv .venv && source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -e ".[dev]"
pytest # 50+ tests, ~3sPre-commit 훅 (gitleaks, trufflehog, ruff, formatter, tenant-fingerprint scrubber):
pip install pre-commit
pre-commit install실제 QBO 샌드박스 영역에 대한 통합 테스트는 QBO_INTEGRATION_TESTS=1로 제한됩니다. 일반적인 기여에는 필요하지 않습니다.
문제 해결
Failed to refresh QBO access token — 갱신 토큰이 무효화되었거나 앱의 client_id / client_secret이 잘못되었습니다. 갱신 토큰은 새 토큰이 발행되는 즉시 무효화되므로, 두 프로세스가 하나의 갱신 토큰을 공유하면 먼저 갱신하는 쪽이 승리합니다. 해결책: 순환된 토큰을 영구 저장하거나(on_refresh_token_rotated 참조), 갱신 토큰 자격 증명당 하나의 서버만 실행하세요.
Missing required environment variables — .env가 로드되기 전에 서버가 시작되었습니다. 부모 셸에서 변수를 export하거나 MCP 호스트 설정의 env 블록에 포함되어 있는지 확인하세요.
데이터가 있음에도 결과가 비어 있음 — QBO_ENVIRONMENT가 자격 증명과 일치하는지 확인하세요. 프로덕션 API 호스트에 샌드박스 갱신 토큰을 사용하면(또는 그 반대) 인증은 되지만 빈 회사가 반환됩니다.
긴 날짜 범위의 느린 속도 — QBO의 쿼리 엔드포인트는 페이지당 1000개 행으로 제한됩니다. 클라이언트가 페이지를 투명하게 순회하지만, 5년치 송장 스캔은 여전히 많은 왕복 통신을 의미합니다. date_from / date_to를 좁히거나 status로 필터링하는 것을 고려하세요.
Transient QBO error: HTTP 429 — Intuit의 속도 제한이 적용되었습니다. 클라이언트는 지수 백오프를 사용하여 자동으로 재시도합니다. 도구 출력에서 이 오류가 보이면 구성된 QBO_MAX_RETRIES를 초과한 것입니다. 값을 높이거나 쿼리 속도를 늦추세요.
기여
이슈와 풀 리퀘스트를 환영합니다. 다음을 준수해 주세요:
PR을 열기 전에
pytest를 실행하세요 (pip install -e ".[dev]").pre-commit run --all-files를 실행하세요.v0.1 범위에 대한 추가 사항은 읽기 전용으로 유지하세요. 쓰기 엔드포인트는 v0.2에 포함됩니다.
테스트에는 합성 데이터만 사용하세요. 실제 고객 이름, 공급업체 이름 또는 영역 ID를 사용하지 마세요.
라이선스
MIT — LICENSE를 참조하세요.
면책 조항
qbo-mcp는 비공식 타사 통합 도구입니다. Intuit Inc.의 보증, 제휴 또는 지원을 받지 않습니다. "QuickBooks" 및 "QuickBooks Online"은 Intuit Inc.의 상표입니다. 사용자의 책임하에 사용하시고, 프로덕션 의사결정에 의존하기 전에 귀하의 영역에서 동작을 확인하십시오.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/alveyautomation/qbo-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server
