테마
SDK로 첫 조회 실행하기
직접 만드는 프로그램에서 MCP 연결과 도구 호출을 확인합니다. 이 예제는 입력 규격만 조회하며 제품·파일·토큰을 출력하지 않습니다.
시작하기 전에
- Node.js 20 이상과 npm, 터미널이 필요합니다.
- 연결이 허용된 개발 환경에 사전 등록한 공개 클라이언트가 있어야 합니다.
- 이 프로그램의 OAuth Authorization Code + PKCE 인증과
data:read사용자 동의를 완료한 access token을 준비합니다. 인증·권한을 따르며 기존 웹 로그인 JWT나 봇 토큰을 사용하지 않습니다. - Codex 로그인을 이 스크립트의 토큰 발급 절차로 대신하지 않습니다. OAuth를 구현하지 않고 AI에서 시작하려면 Codex 연결 설정을 사용합니다.
1. 프로젝트와 SDK를 준비합니다
bash
mkdir infirium-first-read
cd infirium-first-read
npm init -y
npm install @modelcontextprotocol/sdk@1.32.1완성된 first-read.mjs 다운로드를 위 폴더에 저장하거나, 아래 코드를 first-read.mjs에 붙여넣습니다. .mjs 확장자는 Node.js가 ES module로 실행하게 합니다.
js
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
const resource = process.env.INFIRIUM_MCP_RESOURCE;
const accessToken = process.env.INFIRIUM_MCP_ACCESS_TOKEN;
if (!resource || !accessToken) {
throw new Error("Set INFIRIUM_MCP_RESOURCE and INFIRIUM_MCP_ACCESS_TOKEN");
}
const url = new URL(resource);
if (url.protocol !== "https:") throw new Error("An HTTPS MCP resource is required");
const client = new Client({ name: "infirium-first-read", version: "1.0.0" });
try {
await client.connect(new StreamableHTTPClientTransport(url, {
requestInit: { headers: { Authorization: `Bearer ${accessToken}` } },
}));
const { tools } = await client.listTools();
if (!tools.some(tool => tool.name === "infirium_list_data_profiles")) {
throw new Error("Profile tool unavailable: check data:read consent and current authority");
}
const response = await client.callTool({
name: "infirium_list_data_profiles",
arguments: { catalogVersion: 3 },
});
if (response.isError) {
throw new Error(`MCP tool failed: ${response.structuredContent?.error ?? "unknown"}`);
}
const profiles = response.structuredContent?.result;
if (!Array.isArray(profiles)) throw new Error("Unexpected profile response");
console.log(JSON.stringify(profiles.map(({ profileKey, catalogVersion, schemaVersion }) => ({
profileKey, catalogVersion, schemaVersion,
})), null, 2));
} finally {
await client.close();
}2. 환경변수를 설정하고 실행합니다
다음은 Bash에서 실행하는 예입니다. macOS의 기본 zsh를 쓰고 있다면 먼저 bash를 실행해 Bash로 들어갑니다. 토큰을 명령문에 직접 적지 않고, 화면에 표시되지 않는 입력으로 받습니다. 보안 저장소를 사용하는 프로그램에서는 같은 환경변수를 안전하게 주입합니다.
bash
export INFIRIUM_MCP_RESOURCE='https://dev-api.infirium.org/mcp'
read -r -s -p 'MCP access token: ' INFIRIUM_MCP_ACCESS_TOKEN
export INFIRIUM_MCP_ACCESS_TOKEN
node first-read.mjs
unset INFIRIUM_MCP_ACCESS_TOKEN토큰을 소스·설정 파일·AI 프롬프트에 저장하지 않습니다. 이 짧은 예제는 갱신을 구현하지 않으므로 토큰이 만료되면 원래 프로그램의 OAuth 갱신 절차를 사용합니다.
3. 결과를 확인합니다
다음처럼 네 프로필이 출력됩니다. 버전은 접속 서버의 카탈로그를 기준으로 확인합니다.
json
[
{ "profileKey": "part-type-information", "catalogVersion": 3, "schemaVersion": "1.0.0" },
{ "profileKey": "digital-product-passport", "catalogVersion": 3, "schemaVersion": "6.1.0" },
{ "profileKey": "battery-passport", "catalogVersion": 3, "schemaVersion": "6.1.0" },
{ "profileKey": "pcf", "catalogVersion": 3, "schemaVersion": "9.0.0" }
]실제 도구 응답의 성공 본문은 structuredContent.result, 고정 오류는 structuredContent.error입니다. 위 코드는 응답에서 이름과 버전만 골라 출력합니다. client.close()는 전송 연결을 닫으며 서버의 승인 권한을 폐기하지 않습니다.
안 되면
| 상황 | 다음 행동 |
|---|---|
ERR_MODULE_NOT_FOUND | first-read.mjs가 있는 프로젝트에서 npm 설치를 마쳤는지 확인 |
| 환경변수 오류 | 같은 터미널에서 두 변수를 설정했는지 확인. 토큰 값을 출력하지 않음 |
| HTTP 401 | MCP resource용 토큰의 만료·폐기·대상을 확인하고 원래 OAuth로 갱신·재연결 |
| profile tool unavailable | data:read를 프로그램에 등록했는지, 사용자가 동의했는지, 현재 역할·그룹·구독 확인 |
invalid_scope·access_denied | 프로그램 허용 목록·이번 사용자 동의·현재 권한 확인. 목록 밖이면 새 프로그램 등록, 목록 안이면 필요한 범위로 재로그인·동의 |
| 404 | 연결한 개발 환경의 MCP 활성화·메타데이터 경로 확인 |
완료했다면 합성 CSV 미리보기로 진행합니다. 더 많은 도구는 도구 목록, 예산·응답 크기·재시도는 오류·제한을 참고하세요.

