AI 외부 연동 : PHP MCP 구현과 API 연동
블로그 구조화 데이터 관리 시스템을 AI와 연결하기 위해 워드프레스 REST API를 정비하고 PHP MCP 서버를 구현했다. Debian 환경에서 Composer와 MCP SDK를 설치하고, PHP-FPM 전용 풀과 실행 계정으로 권한을 분리했다. 조회 도구를 등록한 뒤 curl을 이용한 로컬 HTTP 시험으로 초기화와 도구 목록 반환, 실제 엔티티 조회를 확인했다. AI 기반 블로그 구조화 데이터 엔티티 관리 시스템 개발기록 2편
블로그 구조화 데이터 관리 데이터베이스를 AI를 이용해 관리하고자 했던 본 필자는,
- 데이터베이스에 직접적인 접근은 워드프레스 플러그인의 API가 담당한다.
- MCP 서버가 ChatGPT의 요청을 플러그인에 전달한다.
- 플러그인에는 최소한의 기능만을 제공해 오동작 가능성을 배제시킨다.
라고 하는 기본 동작 설계를 마치고 구현에 들어갔다. 기본 동작 설계에 대한 상세한 내용은 AI 기반 블로그 구조화 데이터 엔티티 관리 시스템 개발기록 1편을 참고하시기 바란다.
가장 먼저 해야 하는 일 : API 안정화
MCP 서버를 만들기 전, 먼저 구조화 데이터 관리 시스템을 안정화시키는 작업이 필요했다. 기초가 부실하면 올라가던 건물은 반드시 무너진다. 프로젝트의 기반이 되어 줄 기존 구조화 데이터 관리 시스템인 EQSTDTSuit는 0.6.0에서 0.8.1까지 10회 넘는 업데이트가 이루어졌고, 데이터베이스의 구조와 등록 엔티티의 점검도 함께 이루어졌다.
모든 업데이트 단계마다 출력의 동일성 여부를 확인해야 하기 때문에, 블로그의 메타데이터와 JSON-LD를 수집하는 GoldenCrawl과 수집 결과를 기준 기록과 비교하는 GoldComp라는 노가다용 도구를 만들었다.

API 인증에는 워드프레스의 Application Password를 사용했고 API 쪽에서도 조회와 쓰기 조건을 나누었다. API를 통해 구현한 기능은 다음의 다섯 가지이다.
- 엔티티 타입과 타입별 필드 조회
- 기존 엔티티 검색
- 엔티티 상세 조회
- 신규 엔티티 등록
- 기존 엔티티 수정
API 기능을 검증하기 위해 API 테스터를 만들고 점검, 보안, 개선을 반복해 API와 데이터베이스를 충분히 안정화시켰다고 판단한 본 필자는 본격적으로 PHP MCP 서버 구현을 시작했다.

데비안 리눅스 시스템 PHP MCP 서버 구현 과정
다음은 본 필자가 데비안 리눅스에서 PHP MCP 실행 환경을 구현하고 내부 통신을 확인한 실제 과정을 참고하기 위해 기록한 것이다.
Step 1. PHP MCP 개발 환경 준비
PHP를 이용해 MCP를 구현하기 위해서는 개발에 필요한 패키지를 설치해 주어야 한다. PHP에도 데비안 리눅스의 APT와 유사한 패키지 관리 도구가 있는데, 바로 Composer라는 놈이다. 우선 Composer를 설치하고 MCP 패키지를 설치해 준다.
-
PHP Composer 설치
apt-get을 이용해 Composer를 설치한다. 본 필자의 경우, 설치는 정상적으로 진행되었지만 기본 CLI PHP로 Composer를 실행하자 Composer와 관련 라이브러리에서 Deprecated 경고가 발생했다. 이후 작업은 PHP 8.3을 기준으로 진행하기로 결정하고, PHP 8.3을 명시해 다시 실행하니 경고 없이 버전 정보가 출력되었다.
debian@eqmaker:~$ sudo apt-get install composer Reading package lists... Done Building dependency tree... Done (... 중략 ...) debian@eqmaker:~$ composer --version PHP Deprecated: Composer\Pcre\Preg::replace(): Implicitly marking parameter $count as nullable is deprecated, the explicit nullable type must be used instead in /usr/share/php/Composer/Pcre/Preg.php on line 150 Deprecated: Composer\Pcre\Preg::replace(): Implicitly marking parameter $count as nullable is deprecated, the explicit nullable type must be used instead in /usr/share/php/Composer/Pcre/Preg.php on line 150 PHP Deprecated: Composer\Pcre\Preg::replaceCallback(): Implicitly marking parameter $count as nullable is deprecated, the explicit nullable type must be used instead in /usr/share/php/Composer/Pcre/Preg.php on line 177 Deprecated: Composer\Pcre\Preg::replaceCallback(): Implicitly marking parameter $count as nullable is deprecated, the explicit nullable type must be used instead in /usr/share/php/Composer/Pcre/Preg.php on line 177 (... 중략 ...) Deprecation Notice: Constant E_STRICT is deprecated in /usr/share/php/Composer/Util/Silencer.php:36 Composer version 2.5.5 2023-03-21 11:50:05 debian@eqmaker:~$ /usr/bin/php8.3 /usr/bin/composer --version Composer version 2.5.5 2023-03-21 11:50:05
-
PHP MCP SDK 설치
MCP 서버를 구현할 프로젝트 디렉토리를 생성하고 권한을 준 다음, Composer를 이용해 PHP MCP SDK를 설치한다.
/opt아래에stdtbank-mcp디렉토리를 만들어 사용했다.PHP 8.3으로 Composer를 실행해 당시 최신 버전인
mcp/sdk0.8.1로 지정했다. (설치하고 5일 만에 0.9.0 업데이트가 나왔다.;;)설치 중에는 의존 패키지인
php-http/discovery의 실행 여부를 확인한다.debian@eqmaker:~$ sudo mkdir -p /opt/stdtbank-mcp debian@eqmaker:~$ sudo chown debian /opt/stdtbank-mcp debian@eqmaker:~$ sudo chmod 750 /opt/stdtbank-mcp debian@eqmaker:~$ cd /opt/stdtbank-mcp debian@eqmaker:/opt/stdtbank-mcp$ /usr/bin/php8.3 /usr/bin/composer require mcp/sdk:0.8.1 ./composer.json has been created Running composer update mcp/sdk Loading composer repositories with package information Updating dependencies Lock file operations: 23 installs, 0 updates, 0 removals Locking doctrine/deprecations (1.1.6) Locking mcp/sdk (v0.8.1) (... 중략 ...) Downloading mcp/sdk (v0.8.1) php-http/discovery contains a Composer plugin which is currently not in your allow-plugins config. See https://getcomposer.org/allow-plugins Do you trust "php-http/discovery" to execute code and wish to enable it now? (writes "allow-plugins" to composer.json) [y,n,d,?] y (... 중략 ...) 3 packages you are using are looking for funding. Use the composer fund command to find out more! No security vulnerability advisories found
-
PHP MCP SDK 설치 결과 검증
설치된 PHP MCP SDK의 버전과 설치 경로, 의존성 패키지 정상 여부, 보안 감사 결과를 확인한다.
debian@eqmaker:/opt/stdtbank-mcp$ /usr/bin/php8.3 /usr/bin/composer show mcp/sdk name : mcp/sdk (... 중략 ...) versions : * v0.8.1 (... 중략 ...) path : /opt/stdtbank-mcp/vendor/mcp/sdk names : mcp/sdk (... 중략 ...) suggests symfony/finder Required for file-based discovery. debian@eqmaker:/opt/stdtbank-mcp$ /usr/bin/php8.3 /usr/bin/composer check-platform-reqs Checking platform requirements for packages in the vendor dir composer-plugin-api 2.3.0 success (... 중략 ...) debian@eqmaker:/opt/stdtbank-mcp$ /usr/bin/php8.3 /usr/bin/composer audit No security vulnerability advisories found
Step 2. PHP-FPM을 이용한 MCP 실행 환경 분리
MCP 실행을 위한 별도의 로컬 계정을 만들어 권한을 분리한다. 이를 위해 PHP 실행 프로세스를 관리하는 서비스인 PHP-FPM을 설치하고 MCP가 사용할 풀(Pool)을 구성한다.
-
PHP-FPM 설치
본 필자는 설치 과정 중 Sury PGP 키 관련 에러가 발생해 키 업데이트를 진행해야만 했다.
sudo apt-get install php8.3-fpm(...전략...) Created symlink /etc/systemd/system/multi-user.target.wants/php8.3-fpm.service → /lib/systemd/system/php8.3-fpm.service. Setting up php8.3 (8.3.35-1+0~20260925.87+debian12~1.gbp19383d) ... (... 중략 ...) Processing triggers for php8.3-fpm (8.3.35-1+0~20260925.87+debian12~1.gbp19383d) ... NOTICE: Not enabling PHP 8.3 FPM by default.
설치를 완료하고 PHP-FPM 서비스가 동작하고 있나 확인한다. 이어서, 아파치에서 사용하는 모듈에 변경이 없었는지도 함께 확인한다.
debian@eqmaker:~$ sudo systemctl status php8.3-fpm ● php8.3-fpm.service - The PHP 8.3 FastCGI Process Manager Loaded: loaded (/lib/systemd/system/php8.3-fpm.service; enabled; preset: enabled) Active: active (running) (... 중략 ...) debian@eqmaker:~$ sudo apache2ctl -M 2>/dev/null | grep -Ei 'mpm|php|proxy_fcgi' mpm_prefork_module (shared) php_module (shared) - MCP 전용 계정 생성과 권한 부여 : MCP 서버를 실행할 리눅스 계정을 생성하고 위에서 생성한 프로젝트 디렉토리에 대한 실행 권한을 부여한다.
-
MCP 전용 PHP-FPM 풀 구성
코드를 실행할 FPM 풀을 구성했다. 풀 이름은 계정과 동일한
mcpman으로 정하고, 아파치가 연결할 소켓도/run/php/mcpman.sock으로 분리했다./etc/php/8.3/fpm/pool.d/에 새로운 풀의 설정 파일을 생성한 후 PHP-FPM을 재시작해 적용시켜 준다.[mcpman] user = mcpman group = mcpman listen = /run/php/mcpman.sock listen.owner = www-data listen.group = www-data listen.mode = 0660 pm = ondemand pm.max_children = 3 pm.process_idle_timeout = 30s pm.max_requests = 200 security.limit_extensions = .php php_admin_flag[display_errors] = off php_admin_flag[log_errors] = on php_admin_value[error_log] = /var/log/php8.3-fpm.log php_admin_value[session.save_path] = /var/lib/php/sessions전용 소켓이 생성되었는지 확인하고 소켓과 라이브러리, 프로젝트 설정 파일에 대해 계정 접근 권한을 확인한다.
debian@eqmaker:~$ ls -l /run/php/mcpman.sock srw-rw---- 1 www-data www-data 0 Oct 13 10:59 /run/php/mcpman.sock debian@eqmaker:~$ sudo -u www-data test -w /run/php/mcpman.sock && echo 'O' || echo 'X' O debian@eqmaker:~$ sudo -u mcpman test -r /opt/stdtbank-mcp/vendor/autoload.php && echo 'O' || echo 'X' O debian@eqmaker:~$ sudo -u mcpman test -w /opt/stdtbank-mcp/composer.json && echo 'O' || echo 'X' X
Step 3. MCP 인터페이스 구현
이제 MCP 인터페이스를 구현한다. 먼저 STDIO를 이용해 연동 상태를 확인한 후, 로컬 호스트에서 Streamable HTTP로 연동되는지 확인한다. 기능별 역할을 구분하기 위해 API 호출, MCP 서버 구성, 실행 진입점을 각각 별도의 파일로 나누고 curl을 이용해 요청을 보낸다.
-
ServerFactory.php: MCP 서버와 도구 정의build()는 MCP 서버의 기본 정보와 도구를 등록하고 서버 객체를 반환한다. 다음은 엔티티 상세 조회 도구를 중심으로 발췌한 코드이다.public static function build(RestClient $api, ?string $sessionDirectory = null): Server { // MCP 서버의 이름과 버전을 설정한다. $builder = Server::builder() ->setServerInfo('STDTBank Read-Only', '0.1.0') ->addTool( // 도구가 호출되면 REST 클라이언트의 상세 조회를 실행한다. handler: static fn (int $id): array => $api->entityDetails($id), // 도구 이름 name: 'get_entity_details', // 도구 설명, 한글로 입력하는 것도 가능 description: 'Read one existing STDTBank entity by positive integer ID.', // 필수 입력값, id는 1 이상의 정수 inputSchema: ['type' => 'object', 'properties' => [ 'id' => ['type' => 'integer', 'minimum' => 1,],], 'required' => ['id'], 'additionalProperties' => false,],); // HTTP 요청 사이에 사용할 파일 기반 세션 저장소 if ($sessionDirectory !== null) { $builder->setSession(new FileSessionStore($sessionDirectory)); } return $builder->build(); } -
server-http-local.php: HTTP 요청 접수와 MCP 응답 전달fromGlobals()를 이용해 PHP가 받은 HTTP 요청을 SDK에 전달할 수 있는 PSR-7 요청 객체로 변환한다.// HTTP 메시지 객체를 생성할 팩토리를 준비한다. $factory = new Psr17Factory(); // PSR-7 처리 $request = (new ServerRequestCreator($factory, $factory, $factory, $factory))->fromGlobals(); // 워드프레스 REST API 호출 객체 $api = new RestClient(getenv('STDT_REST_BASE_URL') ?: 'https://www.eqmaker.kr', $username, $password); // 도구가 등록된 MCP 서버를 생성 $server = ServerFactory::build($api, $sessionDirectory); // HTTP 요청을 처리할 객체 $transport = new StreamableHttpTransport($request); // SDK의 결과를 HTTP 응답 객체로 반환 $response = $server->run($transport); // 완성된 HTTP 응답을 클라이언트에 전송한다. (new SapiEmitter())->emit($response); -
RestClient.php: 워드프레스 REST API 호출public function entityDetails(int $id): array // 엔티티 ID 검사 상세 조회 경로 구성 { // 유효하지 않은 ID는 API 요청 전에 거부한다. if ($id < 1) { throw new RuntimeException('Entity ID must be a positive integer.'); } // 예를 들어 ID 453이면 entities/453을 조회한다. return $this->get('entities/' . $id); }private function get(string $path, array $query = []): array // HTTPS GET 인증, API의 JSON을 PHP 배열로 도구 실행 함수에 반환 { // REST API 기본 주소와 요청 경로 $base = rtrim($this->baseUrl, '/'); $url = $base . '/wp-json/eqstdt/v1/' . $path; // 검색어 등 쿼리 매개변수가 있으면 URL에 추가한다. if ($query !== []) { $url .= '?' . http_build_query( $query, '', '&', PHP_QUERY_RFC3986 ); } $ch = curl_init($url); if ($ch === false) { throw new RuntimeException('Unable to initialize HTTP request.'); } // GET 요청, 워드프레스 인증정보 curl_setopt_array($ch, [ CURLOPT_HTTPGET => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPAUTH => CURLAUTH_BASIC, CURLOPT_USERPWD => $this->username . ':' . $this->applicationPassword, CURLOPT_HTTPHEADER => ['Accept: application/json'], CURLOPT_CONNECTTIMEOUT => 5, CURLOPT_TIMEOUT => 15, CURLOPT_SSL_VERIFYPEER => true, CURLOPT_SSL_VERIFYHOST => 2, CURLOPT_FOLLOWLOCATION => false, CURLOPT_MAXREDIRS => 0, CURLOPT_PROTOCOLS => CURLPROTO_HTTPS, CURLOPT_MAXFILESIZE => 2 * 1024 * 1024, ]); try { // 요청 보내고 응답 상태 코드 확인 $body = curl_exec($ch); $status = (int) curl_getinfo($ch, CURLINFO_RESPONSE_CODE); if (!is_string($body)) {throw new RuntimeException('REST API connection failed.');} if (strlen($body) > 2 * 1024 * 1024) {throw new RuntimeException('REST API response exceeds size limit.');} if ($status !== 200) {throw new RuntimeException('REST API returned HTTP ' . $status . '.');} // JSON 응답 PHP 배열 변환 $data = json_decode($body, true, 64, JSON_THROW_ON_ERROR); if (!is_array($data)) { throw new RuntimeException('REST API returned a non-object JSON response.'); } return $data; } catch (\JsonException $e) {throw new RuntimeException('REST API returned invalid JSON.', 0, $e);} finally {curl_close($ch);} // CURL 정리 }
클라이언트의 MCP 요청은 server-http-local.php를 통해 SDK에 전달된다. SDK는 ServerFactory.php의 도구 실행 함수를 호출하고, RestClient.php는 워드프레스 REST API를 통해 데이터를 조회한다. 반환된 PHP 배열은 SDK에서 MCP 응답으로 구성되며, HTTP 진입점에서 클라이언트로 전송된다.
Step 4. 로컬 HTTP 환경에서 MCP 동작 검증
구현한 MCP 인터페이스가 실제로 동작하는지 확인한다. PHP 내장 웹 서버를 로컬 주소에서 실행하고, 다른 터미널에서 curl로 요청을 보낸다. MCP 인터페이스와 REST API의 연동을 확인하는 과정이다. 세션 디렉토리는 프로젝트 디렉토리의 /var/sessions를 사용한다.
-
로컬 HTTP 서버 실행
debian@eqmaker:/opt/stdtbank-mcp$ sudo -u mcpman env STDT_MCP_LOCAL_TEST=1 STDT_MCP_SESSION_DIR=/opt/stdtbank-mcp/var/sessions STDT_REST_USERNAME=test-user STDT_REST_APPLICATION_PASSWORD=test-password /usr/bin/php8.3 -S 127.0.0.1:8765 server-http-local.php PHP 8.3.35 Development Server (http://127.0.0.1:8765) started 127.0.0.1:45506 Accepted 127.0.0.1:45506 Closing
-
초기화 요청 전송
새로운 콘솔 세션에서 로컬 HTTP 서버를 향해 초기화 요청을 전송한다. HTTP 200과 함께 MCP의 세션 ID와 문자열이 돌아와야 한다.
debian@eqmaker:~$ curl -sS -i http://127.0.0.1:8765/ -H 'Content-Type: application/json' -H 'Accept: application/json, text/event-stream' -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"mcp-http-test","version":"1.0"}}}' HTTP/1.1 200 OK (... 중략 ...) Mcp-Session-Id: abcdefgh-ijkl-mnop-qrst-uvwxyz123456 Access-Control-Expose-Headers: Mcp-Session-Id (... 중략 ...) {"jsonrpc":"2.0","id":1,"result":{"protocolVersion":"2025-03-26", (... 중략...) via API Tester."}} -
초기화 완료 알림 전송
초기화가 완료되었다는 알림을 전송한다. 이후 요청에는 앞에서 반환받은 세션 ID를 사용한다.
debian@eqmaker:~$ curl -sS -i http://127.0.0.1:8765/ -H 'Content-Type: application/json' -H 'Accept: application/json, text/event-stream' -H 'MCP-Protocol-Version: 2025-03-26' -H 'Mcp-Session-Id: abcdefgh-ijkl-mnop-qrst-uvwxyz123456' -d '{"jsonrpc":"2.0","method":"notifications/initialized"}' HTTP/1.1 202 Accepted (... 중략 ...) -
등록된 도구 목록 요청
같은 세션에서
tools/list를 요청한다.debian@eqmaker:~$ curl -sS -i http://127.0.0.1:8765/ -H 'Content-Type: application/json' -H 'Accept: application/json, text/event-stream' -H 'MCP-Protocol-Version: 2025-03-26' -H 'Mcp-Session-Id: abcdefgh-ijkl-mnop-qrst-uvwxyz123456' -d '{"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}}' HTTP/1.1 200 OK (... 중략 ...) Mcp-Session-Id: abcdefgh-ijkl-mnop-qrst-uvwxyz123456 (... 중략 ...) { "jsonrpc": "2.0", "id": 2, "result": { "tools": [ (... 중략 ...) { "name": "get_entity_details", "inputSchema": { "type": "object", "properties": { "id": { "type": "integer", "minimum": 1 } }, "required": ["id"], "additionalProperties": false }, "description": "Read one existing STDTBank entity by positive integer ID." } ] } }
Step 5. 실제 데이터베이스의 내용 조회
로컬 HTTP 서버를 실제 워드프레스의 암호를 이용해 재실행하고 실제 데이터베이스에 등록된 내용을 조회한다. ID 453번 FFmpeg에 대한 엔티티 정보를 조회해 보았다.
debian@eqmaker:~$ curl -sS -i http://127.0.0.1:8765/ \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-H 'MCP-Protocol-Version: 2025-03-26' \
-H 'Mcp-Session-Id: eqmakerd-ecte-ngeq-make-reqmakerdect' \
-d '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"get_entity_details","arguments":{"id":453}}}'
HTTP/1.1 200 OK
Host: 127.0.0.1:8765
(...중략...)
Mcp-Session-Id: eqmakerd-ecte-ngeq-make-reqmakerdect
Access-Control-Expose-Headers: Mcp-Session-Id
{"jsonrpc":"2.0","id":3,"result":{"content":[ (... 실제 DB 내용 생략 ... ) ],"isError":false,"structuredContent":{ (...실제 DB 내용 생략 ...) }}}
응답 본문에서는 isError: false와 함께 FFmpeg의 상세 정보가 반환되었다.
마무리
이렇게 워드프레스 REST API를 정비하고, PHP MCP 서버의 실행 환경과 조회 도구를 구현했다. 로컬 시험에서는 도구 목록을 확인하고 실제 데이터베이스에 등록된 엔티티 정보를 받아 오는 데까지 성공했다. 복사와 붙여넣기로 옮기던 데이터를 AI가 직접 조회할 수 있도록 연결 통로를 마련한 셈이다.
이제 MCP를 지원하는 AI 어플리케이션에 서버를 연결하면, 프롬프트로 요청해 조회 도구를 사용할 수 있게 된다. 다만 외부에서 접근하도록 공개하기 전에, 허용된 요청만 받아들이도록 인증과 접근 제어를 먼저 구성해야 한다.
FAQ
- PHP-FPM은 무엇인가?
- PHP-FPM은 웹 서버가 전달한 요청에 따라 PHP 코드를 실행하는 작업 프로세스를 관리하는 프로그램이다. 실행 계정과 PHP 설정, 프로세스 수 등을 풀 단위로 관리할 수 있다.
- PHP-FPM 풀(Pool)이란 무엇인가?
- PHP-FPM 안에서 공통된 실행 계정과 설정으로 운영하는 작업 프로세스 묶음이다. 하나의 PHP-FPM 서비스에 여러 풀을 구성하고, 풀마다 연결 소켓과 프로세스 수 등을 지정할 수 있다. 풀을 분리해도 파일이나 네트워크 접근이 자동으로 완전히 격리되는 것은 아니다.
- Streamable HTTP란 무엇인가?
- MCP 메시지를 HTTP로 주고받는 전송 방식이다. 클라이언트가 요청을 보내면 서버는 JSON 응답을 반환하거나, 필요에 따라 SSE(Server-Sent Events)로 메시지를 스트리밍할 수 있다.
- PSR-7 객체란 무엇인가?
- PHP의 HTTP 메시지 표준 인터페이스인 PSR-7에 맞춰 요청이나 응답을 표현한 객체이다. 요청 메소드, 주소, 헤더, 본문 등을 일정한 방식으로 다룰 수 있게 한다.
- Composer는 무엇이며 MCP SDK 설치에 왜 사용하는가?
- Composer는 PHP 프로젝트가 사용하는 패키지와 의존성을 관리하는 도구이다. 필요한 라이브러리를 설치하고 버전 조건을 관리하며 자동 로딩 파일을 생성한다.
- PHP로 MCP 서버를 만들려면 반드시 PHP-FPM이 필요한가?
- 반드시 필요한 것은 아니다. STDIO 방식은 PHP CLI로 실행할 수 있고, 본문의 로컬 HTTP 시험은 PHP 내장 웹 서버를 사용했다. PHP-FPM은 이후 아파치를 통해 MCP 요청을 처리하면서 실행 계정과 설정을 별도로 관리하기 위해 준비한 구성이다.
- MCP 도구의 설명은 반드시 영어로 작성해야 하는가?
- 아니다. 도구의 description은 자연어 설명이므로 한글로 작성할 수 있다. 호스트가 도구 정보를 모델에 제공하면 모델은 설명과 입력 형식 등을 참고해 사용할 도구를 판단한다.
- MCP 세션 ID와 인증정보는 무엇이 다른가?
- MCP 세션 ID는 여러 요청을 하나의 세션으로 연결하기 위한 식별자이다. 인증정보는 요청자의 신원과 접근권한을 확인하는 데 사용한다. 세션 ID 자체는 인증 수단이 아니다.