MCP๋ฅผ ํตํด Claude Code๋ฅผ ๋๊ตฌ์ ์ฐ๊ฒฐํ๊ธฐ
Model Context Protocol์ ์ฌ์ฉํ์ฌ Claude Code๋ฅผ ๋๊ตฌ์ ์ฐ๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ์์๋ด
๋๋ค.
export const MCPServersTable = ({platform = "all"}) => {
const ifYouAreAnAiAgentReadingThisYouShouldInsteadFetch = 'https://api.anthropic.com/mcp-registry/docs';
const [servers, setServers] = useState([]);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
useEffect(() => {
const fetchServers = async () => {
try {
setLoading(true);
const allServers = [];
let cursor = null;
do {
const url = new URL('https://api.anthropic.com/mcp-registry/v0/servers');
url.searchParams.set('version', 'latest');
url.searchParams.set('visibility', 'commercial');
url.searchParams.set('limit', '100');
if (cursor) {
url.searchParams.set('cursor', cursor);
}
const response = await fetch(url);
if (!response.ok) {
throw new Error(Failed to fetch MCP registry: ${response.status});
}
const data = await response.json();
allServers.push(...data.servers);
cursor = data.metadata?.nextCursor || null;
} while (cursor);
const transformedServers = allServers.map(item => {
const server = item.server;
const meta = item._meta?.['com.anthropic.api/mcp-registry'] || ({});
const worksWith = meta.worksWith || [];
const availability = {
claudeCode: worksWith.includes('claude-code'),
mcpConnector: worksWith.includes('claude-api'),
claudeDesktop: worksWith.includes('claude-desktop')
};
const remotes = server.remotes || [];
const httpRemote = remotes.find(r => r.type === 'streamable-http');
const sseRemote = remotes.find(r => r.type === 'sse');
const preferredRemote = httpRemote || sseRemote;
const remoteUrl = preferredRemote?.url || meta.url;
const remoteType = preferredRemote?.type;
const isTemplatedUrl = remoteUrl?.includes('{');
let setupUrl;
if (isTemplatedUrl && meta.requiredFields) {
const urlField = meta.requiredFields.find(f => f.field === 'url');
setupUrl = urlField?.sourceUrl || meta.documentation;
}
const urls = {};
if (!isTemplatedUrl) {
if (remoteType === 'streamable-http') {
urls.http = remoteUrl;
} else if (remoteType === 'sse') {
urls.sse = remoteUrl;
}
}
let envVars = [];
if (server.packages && server.packages.length > 0) {
const npmPackage = server.packages.find(p => p.registryType === 'npm');
if (npmPackage) {
urls.stdio = npx -y ${npmPackage.identifier};
if (npmPackage.environmentVariables) {
envVars = npmPackage.environmentVariables;
}
}
}
return {
name: meta.displayName || server.title || server.name,
description: meta.oneLiner || server.description,
documentation: meta.documentation,
urls: urls,
envVars: envVars,
availability: availability,
customCommands: meta.claudeCodeCopyText ? {
claudeCode: meta.claudeCodeCopyText
} : undefined,
setupUrl: setupUrl
};
});
setServers(transformedServers);
setError(null);
} catch (err) {
setError(err.message);
console.error('Error fetching MCP registry:', err);
} finally {
setLoading(false);
}
};
fetchServers();
}, []);
const generateClaudeCodeCommand = server => {
if (server.customCommands && server.customCommands.claudeCode) {
return server.customCommands.claudeCode.replace('--transport streamable-http', '--transport http');
}
const serverSlug = server.name.toLowerCase().replace(/[^a-z0-9]/g, '-');
if (server.urls.http) {
return claude mcp add ${serverSlug} --transport http ${server.urls.http};
}
if (server.urls.sse) {
return claude mcp add ${serverSlug} --transport sse ${server.urls.sse};
}
if (server.urls.stdio) {
const envFlags = server.envVars && server.envVars.length > 0 ? server.envVars.map(v => --env ${v.name}=YOUR_${v.name}).join(' ') : '';
const baseCommand = claude mcp add ${serverSlug} --transport stdio;
return envFlags ? ${baseCommand} ${envFlags} -- ${server.urls.stdio} : ${baseCommand} -- ${server.urls.stdio};
}
return null;
};
if (loading) {
return
Loading MCP servers...
;
}
if (error) {
return Error loading MCP servers: {error}
;
}
const filteredServers = servers.filter(server => {
if (platform === "claudeCode") {
return server.availability.claudeCode;
} else if (platform === "mcpConnector") {
return server.availability.mcpConnector;
} else if (platform === "claudeDesktop") {
return server.availability.claudeDesktop;
} else if (platform === "all") {
return true;
} else {
throw new Error(Unknown platform: ${platform});
}
});
return <>
<div className="cards-container">
{filteredServers.map(server => {
const claudeCodeCommand = generateClaudeCodeCommand(server);
const mcpUrl = server.urls.http || server.urls.sse;
const commandToShow = platform === "claudeCode" ? claudeCodeCommand : mcpUrl;
return <div key={server.name} className="server-card">
<div>
{server.documentation ? <a href={server.documentation}>
<strong>{server.name}</strong>
</a> : <strong>{server.name}</strong>}
</div>
<p style={{
margin: '0.5rem 0',
fontSize: '0.9rem'
}}>
{server.description}
</p>
{server.setupUrl && <p style={{
margin: '0.25rem 0',
fontSize: '0.8rem',
fontStyle: 'italic',
opacity: 0.7
}}>
Requires user-specific URL.{' '}
<a href={server.setupUrl} style={{
textDecoration: 'underline'
}}>
Get your URL here
</a>.
</p>}
{commandToShow && !server.setupUrl && <>
<p style={{
display: 'block',
fontSize: '0.75rem',
fontWeight: 500,
minWidth: 'fit-content',
marginTop: '0.5rem',
marginBottom: 0
}}>
{platform === "claudeCode" ? "Command" : "URL"}
</p>
<div className="command-row">
<code>
{commandToShow}
</code>
</div>
</>}
</div>;
})}
</>;
};
Claude Code๋ AI ๋๊ตฌ ํตํฉ์ ์ํ ์คํ ์์ค ํ์ค์ธ Model Context Protocol (MCP)๋ฅผ ํตํด ์๋ฐฑ ๊ฐ์ ์ธ๋ถ ๋๊ตฌ ๋ฐ ๋ฐ์ดํฐ ์์ค์ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค. MCP ์๋ฒ๋ Claude Code์ ๋๊ตฌ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฐ API์ ๋ํ ์ก์ธ์ค๋ฅผ ์ ๊ณตํฉ๋๋ค.
๋ค๋ฅธ ๋๊ตฌ(์: ์ด์ ์ถ์ ๊ธฐ ๋๋ ๋ชจ๋ํฐ๋ง ๋์๋ณด๋)์์ ์ฑํ
์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ๋ ์์ ์ ๋ฐ๊ฒฌํ ๋ ์๋ฒ๋ฅผ ์ฐ๊ฒฐํ์ธ์. ์ฐ๊ฒฐ๋๋ฉด Claude๋ ๋ถ์ฌ๋ฃ์ ๋ด์ฉ์์ ์์
ํ๋ ๋์ ํด๋น ์์คํ
์ ์ง์ ์ฝ๊ณ ์๋ํ ์ ์์ต๋๋ค.
MCP๋ก ํ ์ ์๋ ๊ฒ
MCP ์๋ฒ๊ฐ ์ฐ๊ฒฐ๋๋ฉด Claude Code์ ๋ค์์ ์์ฒญํ ์ ์์ต๋๋ค:
- ์ด์ ์ถ์ ๊ธฐ์์ ๊ธฐ๋ฅ ๊ตฌํ: "JIRA ์ด์ ENG-4521์ ์ค๋ช
๋ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ณ GitHub์์ PR์ ์์ฑํ์ธ์."
- ๋ชจ๋ํฐ๋ง ๋ฐ์ดํฐ ๋ถ์: "Sentry์ Statsig์ ํ์ธํ์ฌ ENG-4521์ ์ค๋ช
๋ ๊ธฐ๋ฅ์ ์ฌ์ฉ๋์ ํ์ธํ์ธ์."
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ: "PostgreSQL ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ธฐ๋ฅ ENG-4521์ ์ฌ์ฉํ ๋ฌด์์ ์ฌ์ฉ์ 10๋ช
์ ์ด๋ฉ์ผ์ ์ฐพ์ผ์ธ์."
- ๋์์ธ ํตํฉ: "Slack์ ๊ฒ์๋ ์๋ก์ด Figma ๋์์ธ์ ๊ธฐ๋ฐ์ผ๋ก ํ์ค ์ด๋ฉ์ผ ํ
ํ๋ฆฟ์ ์
๋ฐ์ดํธํ์ธ์."
- ์ํฌํ๋ก์ฐ ์๋ํ: "์ด 10๋ช
์ ์ฌ์ฉ์๋ฅผ ์๋ก์ด ๊ธฐ๋ฅ์ ๋ํ ํผ๋๋ฐฑ ์ธ์
์ ์ด๋ํ๋ Gmail ์ด์์ ์์ฑํ์ธ์."
- ์ธ๋ถ ์ด๋ฒคํธ์ ๋ฐ์: MCP ์๋ฒ๋ ์ฑ๋๋ก๋ ์๋ํ ์ ์์ผ๋ฉฐ, ์ธ์
์ ๋ฉ์์ง๋ฅผ ํธ์ํ๋ฏ๋ก Claude๋ ์๋ฆฌ๋ฅผ ๋น์ด ๋์ Telegram ๋ฉ์์ง, Discord ์ฑํ
๋๋ webhook ์ด๋ฒคํธ์ ๋ฐ์ํ ์ ์์ต๋๋ค.
์ธ๊ธฐ ์๋ MCP ์๋ฒ
Claude Code์ ์ฐ๊ฒฐํ ์ ์๋ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ MCP ์๋ฒ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
MCP ์๋ฒ ์ค์น
MCP ์๋ฒ๋ ํ์์ ๋ฐ๋ผ ์ธ ๊ฐ์ง ๋ฐฉ์์ผ๋ก ๊ตฌ์ฑํ ์ ์์ต๋๋ค:
์ต์
1: ์๊ฒฉ HTTP ์๋ฒ ์ถ๊ฐ
HTTP ์๋ฒ๋ ์๊ฒฉ MCP ์๋ฒ์ ์ฐ๊ฒฐํ๊ธฐ ์ํ ๊ถ์ฅ ์ต์
์
๋๋ค. ์ด๋ ํด๋ผ์ฐ๋ ๊ธฐ๋ฐ ์๋น์ค์ ๊ฐ์ฅ ๋๋ฆฌ ์ง์๋๋ ์ ์ก ๋ฐฉ์์
๋๋ค.
claude mcp add --transport http <name> <url>
claude mcp add --transport http notion https://mcp.notion.com/mcp
claude mcp add --transport http secure-api https://api.example.com/mcp \
--header "Authorization: Bearer your-token"
.mcp.json, ~/.claude.json ๋๋ claude mcp add-json์ ํตํด JSON์ผ๋ก MCP ์๋ฒ๋ฅผ ๊ตฌ์ฑํ ๋, type ํ๋๋ http์ ๋ณ์นญ์ผ๋ก streamable-http๋ฅผ ํ์ฉํฉ๋๋ค. MCP ์ฌ์์ ์ด ์ ์ก์ ๋ํด streamable-http๋ผ๋ ์ด๋ฆ์ ์ฌ์ฉํ๋ฏ๋ก ์๋ฒ ์ค๋ช
์์์ ๋ณต์ฌํ ๊ตฌ์ฑ์ด ์์ ์์ด ์๋ํฉ๋๋ค.
์ต์
2: ์๊ฒฉ SSE ์๋ฒ ์ถ๊ฐ
claude mcp add --transport sse <name> <url>
claude mcp add --transport sse asana https://mcp.asana.com/sse
claude mcp add --transport sse private-api https://api.company.com/sse \
--header "X-API-Key: your-key-here"
์ต์
3: ๋ก์ปฌ stdio ์๋ฒ ์ถ๊ฐ
Stdio ์๋ฒ๋ ์ปดํจํฐ์์ ๋ก์ปฌ ํ๋ก์ธ์ค๋ก ์คํ๋ฉ๋๋ค. ์์คํ
์ ์ง์ ์ก์ธ์คํ๊ฑฐ๋ ์ฌ์ฉ์ ์ ์ ์คํฌ๋ฆฝํธ๊ฐ ํ์ํ ๋๊ตฌ์ ์ด์์ ์
๋๋ค.
claude mcp add [options] <name> -- <command> [args...]
claude mcp add --transport stdio --env AIRTABLE_API_KEY=YOUR_KEY airtable \
-- npx -y airtable-mcp-server
์๋ฒ ๊ด๋ฆฌ
๊ตฌ์ฑํ ํ์๋ ๋ค์ ๋ช
๋ น์ผ๋ก MCP ์๋ฒ๋ฅผ ๊ด๋ฆฌํ ์ ์์ต๋๋ค:
claude mcp list
claude mcp get github
claude mcp remove github
/mcp
/mcp ํจ๋์ ๊ฐ ์ฐ๊ฒฐ๋ ์๋ฒ ์์ ๋๊ตฌ ๊ฐ์๋ฅผ ํ์ํ๊ณ ๋๊ตฌ ๊ธฐ๋ฅ์ ๊ด๊ณ ํ์ง๋ง ๋๊ตฌ๋ฅผ ๋
ธ์ถํ์ง ์๋ ์๋ฒ์ ํ๋๊ทธ๋ฅผ ์ง์ ํฉ๋๋ค.
์๋ฒ ์ด๋ฆ workspace๋ ๋ด๋ถ ์ฌ์ฉ์ ์ํด ์์ฝ๋์ด ์์ต๋๋ค. ๊ตฌ์ฑ์์ ํด๋น ์ด๋ฆ์ ์๋ฒ๋ฅผ ์ ์ํ๋ฉด Claude Code๋ ๋ก๋ ์ ์ด๋ฅผ ๊ฑด๋๋ฐ๊ณ ์ด๋ฆ์ ๋ฐ๊พธ๋๋ก ์์ฒญํ๋ ๊ฒฝ๊ณ ๋ฅผ ํ์ํฉ๋๋ค.
๋์ ๋๊ตฌ ์
๋ฐ์ดํธ
Claude Code๋ MCP list_changed ์๋ฆผ์ ์ง์ํ๋ฏ๋ก MCP ์๋ฒ๊ฐ ์ฐ๊ฒฐ์ ๋์๋ค๊ฐ ๋ค์ ์ฐ๊ฒฐํ ํ์ ์์ด ์ฌ์ฉ ๊ฐ๋ฅํ ๋๊ตฌ, ํ๋กฌํํธ ๋ฐ ๋ฆฌ์์ค๋ฅผ ๋์ ์ผ๋ก ์
๋ฐ์ดํธํ ์ ์์ต๋๋ค. MCP ์๋ฒ๊ฐ list_changed ์๋ฆผ์ ๋ณด๋ด๋ฉด Claude Code๋ ํด๋น ์๋ฒ์์ ์ฌ์ฉ ๊ฐ๋ฅํ ๊ธฐ๋ฅ์ ์๋์ผ๋ก ์๋ก ๊ณ ์นฉ๋๋ค.
์๋ ์ฌ์ฐ๊ฒฐ
HTTP ๋๋ SSE ์๋ฒ๊ฐ ์ธ์
์ค์ ์ฐ๊ฒฐ์ด ๋์ด์ง๋ฉด Claude Code๋ ์ง์ ๋ฐฑ์คํ๋ฅผ ์ฌ์ฉํ์ฌ ์๋์ผ๋ก ์ฌ์ฐ๊ฒฐํฉ๋๋ค: ์ต๋ 5๋ฒ์ ์๋, 1์ด ์ง์ฐ์ผ๋ก ์์ํ์ฌ ๋งค๋ฒ ๋ ๋ฐฐ์ฉ ์ฆ๊ฐํฉ๋๋ค. ์๋ฒ๋ ์ฌ์ฐ๊ฒฐ์ด ์งํ ์ค์ธ ๋์ /mcp์์ ๋ณด๋ฅ ์ค์ผ๋ก ๋ํ๋ฉ๋๋ค. 5๋ฒ์ ์คํจ ์๋ ํ ์๋ฒ๋ ์คํจ๋ก ํ์๋๋ฉฐ /mcp์์ ์๋์ผ๋ก ๋ค์ ์๋ํ ์ ์์ต๋๋ค. Stdio ์๋ฒ๋ ๋ก์ปฌ ํ๋ก์ธ์ค์ด๋ฉฐ ์๋์ผ๋ก ์ฌ์ฐ๊ฒฐ๋์ง ์์ต๋๋ค.
HTTP ๋๋ SSE ์๋ฒ๊ฐ ์์ ์ ์ด๊ธฐ ์ฐ๊ฒฐ์ ์คํจํ ๋๋ ๋์ผํ ๋ฐฑ์คํ๊ฐ ์ ์ฉ๋ฉ๋๋ค. v2.1.121๋ถํฐ Claude Code๋ 5xx ์๋ต, ์ฐ๊ฒฐ ๊ฑฐ๋ถ ๋๋ ์๊ฐ ์ด๊ณผ์ ๊ฐ์ ์ผ์์ ์ค๋ฅ์ ๋ํด ์ด๊ธฐ ์ฐ๊ฒฐ์ ์ต๋ 3๋ฒ ์ฌ์๋ํ ํ, ์ฌ์ ํ ์ฐ๊ฒฐํ ์ ์์ผ๋ฉด ์๋ฒ๋ฅผ ์คํจ๋ก ํ์ํฉ๋๋ค. ์ธ์ฆ ๋ฐ ์ฐพ์ ์ ์์ ์ค๋ฅ๋ ํด๊ฒฐํ๊ธฐ ์ํด ๊ตฌ์ฑ ๋ณ๊ฒฝ์ด ํ์ํ๋ฏ๋ก ์ฌ์๋๋์ง ์์ต๋๋ค.
์ฑ๋์ ์ฌ์ฉํ ๋ฉ์์ง ํธ์
MCP ์๋ฒ๋ ๋ํ ๋ฉ์์ง๋ฅผ ์ธ์
์ ์ง์ ํธ์ํ ์ ์์ผ๋ฏ๋ก Claude๋ CI ๊ฒฐ๊ณผ, ๋ชจ๋ํฐ๋ง ๊ฒฝ๊ณ ๋๋ ์ฑํ
๋ฉ์์ง์ ๊ฐ์ ์ธ๋ถ ์ด๋ฒคํธ์ ๋ฐ์ํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํ์ฑํํ๋ ค๋ฉด ์๋ฒ๊ฐ claude/channel ๊ธฐ๋ฅ์ ์ ์ธํ๊ณ ์์ ์ --channels ํ๋๊ทธ๋ก ์ตํธ์ธํฉ๋๋ค. ๊ณต์์ ์ผ๋ก ์ง์๋๋ ์ฑ๋์ ์ฌ์ฉํ๋ ค๋ฉด ์ฑ๋์ ์ฐธ์กฐํ๊ฑฐ๋, ์์ ๋ง์ ์ฑ๋์ ๊ตฌ์ถํ๋ ค๋ฉด ์ฑ๋ ์ฐธ์กฐ๋ฅผ ์ฐธ์กฐํ์ธ์.
ํ๋ฌ๊ทธ์ธ ์ ๊ณต MCP ์๋ฒ
ํ๋ฌ๊ทธ์ธ์ MCP ์๋ฒ๋ฅผ ๋ฒ๋ค๋ก ์ ๊ณตํ ์ ์์ผ๋ฉฐ, ํ๋ฌ๊ทธ์ธ์ด ํ์ฑํ๋๋ฉด ๋๊ตฌ ๋ฐ ํตํฉ์ ์๋์ผ๋ก ์ ๊ณตํฉ๋๋ค. ํ๋ฌ๊ทธ์ธ MCP ์๋ฒ๋ ์ฌ์ฉ์ ๊ตฌ์ฑ ์๋ฒ์ ๋์ผํ๊ฒ ์๋ํฉ๋๋ค.
ํ๋ฌ๊ทธ์ธ MCP ์๋ฒ์ ์๋ ๋ฐฉ์:
- ํ๋ฌ๊ทธ์ธ์ ํ๋ฌ๊ทธ์ธ ๋ฃจํธ์
.mcp.json ๋๋ plugin.json์ ์ธ๋ผ์ธ์ผ๋ก MCP ์๋ฒ๋ฅผ ์ ์ํฉ๋๋ค
- ํ๋ฌ๊ทธ์ธ์ด ํ์ฑํ๋๋ฉด MCP ์๋ฒ๊ฐ ์๋์ผ๋ก ์์๋ฉ๋๋ค
- ํ๋ฌ๊ทธ์ธ MCP ๋๊ตฌ๋ ์๋์ผ๋ก ๊ตฌ์ฑ๋ MCP ๋๊ตฌ์ ํจ๊ป ๋ํ๋ฉ๋๋ค
- ํ๋ฌ๊ทธ์ธ ์๋ฒ๋ ํ๋ฌ๊ทธ์ธ ์ค์น๋ฅผ ํตํด ๊ด๋ฆฌ๋ฉ๋๋ค (
/mcp ๋ช
๋ น์ด ์๋)
ํ๋ฌ๊ทธ์ธ MCP ๊ตฌ์ฑ ์:
ํ๋ฌ๊ทธ์ธ ๋ฃจํธ์ .mcp.json:
{
"mcpServers": {
"database-tools": {
"command": "${CLAUDE_PLUGIN_ROOT}/servers/db-server",
"args": ["--config", "${CLAUDE_PLUGIN_ROOT}/config.json"],
"env": {
"DB_URL": "${DB_URL}"
}
}
}
}
๋๋ plugin.json์ ์ธ๋ผ์ธ:
{
"name": "my-plugin",
"mcpServers": {
"plugin-api": {
"command": "${CLAUDE_PLUGIN_ROOT}/servers/api-server",
"args": ["--port", "8080"]
}
}
}
ํ๋ฌ๊ทธ์ธ MCP ๊ธฐ๋ฅ:
- ์๋ ๋ผ์ดํ์ฌ์ดํด: ์ธ์
์์ ์ ํ์ฑํ๋ ํ๋ฌ๊ทธ์ธ์ ์๋ฒ๊ฐ ์๋์ผ๋ก ์ฐ๊ฒฐ๋ฉ๋๋ค. ์ธ์
์ค์ ํ๋ฌ๊ทธ์ธ์ ํ์ฑํํ๊ฑฐ๋ ๋นํ์ฑํํ๋ฉด
/reload-plugins๋ฅผ ์คํํ์ฌ MCP ์๋ฒ๋ฅผ ์ฐ๊ฒฐํ๊ฑฐ๋ ์ฐ๊ฒฐ ํด์ ํฉ๋๋ค
- ํ๊ฒฝ ๋ณ์: ๋ฒ๋ค๋ ํ๋ฌ๊ทธ์ธ ํ์ผ์
${CLAUDE_PLUGIN_ROOT} ์ฌ์ฉ ๋ฐ ํ๋ฌ๊ทธ์ธ ์
๋ฐ์ดํธ๋ฅผ ์ ์งํ๋ ์ง์์ ์ธ ์ํ์ ${CLAUDE_PLUGIN_DATA} ์ฌ์ฉ
- ์ฌ์ฉ์ ํ๊ฒฝ ์ก์ธ์ค: ์๋์ผ๋ก ๊ตฌ์ฑ๋ ์๋ฒ์ ๋์ผํ ํ๊ฒฝ ๋ณ์์ ์ก์ธ์ค
- ์ฌ๋ฌ ์ ์ก ์ ํ: stdio, SSE ๋ฐ HTTP ์ ์ก ์ง์ (์ ์ก ์ง์์ ์๋ฒ์ ๋ฐ๋ผ ๋ค๋ฅผ ์ ์์)
ํ๋ฌ๊ทธ์ธ MCP ์๋ฒ ๋ณด๊ธฐ:
/mcp
ํ๋ฌ๊ทธ์ธ ์๋ฒ๋ ํ๋ฌ๊ทธ์ธ์์ ์จ ๊ฒ์ ๋ํ๋ด๋ ํ์๊ธฐ์ ํจ๊ป ๋ชฉ๋ก์ ๋ํ๋ฉ๋๋ค.
ํ๋ฌ๊ทธ์ธ MCP ์๋ฒ์ ์ด์ :
- ๋ฒ๋ค ๋ฐฐํฌ: ๋๊ตฌ ๋ฐ ์๋ฒ๊ฐ ํจ๊ป ํจํค์ง๋จ
- ์๋ ์ค์ : ์๋ MCP ๊ตฌ์ฑ์ด ํ์ ์์
- ํ ์ผ๊ด์ฑ: ํ๋ฌ๊ทธ์ธ์ด ์ค์น๋๋ฉด ๋ชจ๋ ์ฌ๋์ด ๋์ผํ ๋๊ตฌ๋ฅผ ์ป์
ํ๋ฌ๊ทธ์ธ๊ณผ ํจ๊ป MCP ์๋ฒ๋ฅผ ๋ฒ๋ค๋ก ์ ๊ณตํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์์ธํ ๋ด์ฉ์ ํ๋ฌ๊ทธ์ธ ๊ตฌ์ฑ ์์ ์ฐธ์กฐ๋ฅผ ์ฐธ์กฐํ์ธ์.
MCP ์ค์น ๋ฒ์
MCP ์๋ฒ๋ ์ธ ๊ฐ์ง ๋ฒ์์์ ๊ตฌ์ฑํ ์ ์์ต๋๋ค. ์ ํํ ๋ฒ์๋ ์๋ฒ๊ฐ ๋ก๋๋๋ ํ๋ก์ ํธ์ ๊ตฌ์ฑ์ด ํ๊ณผ ๊ณต์ ๋๋์ง ์ฌ๋ถ๋ฅผ ์ ์ดํฉ๋๋ค. ๊ด๋ฆฌ์๋ ๊ด๋ฆฌํ ๊ตฌ์ฑ์ ํตํด ์ํฐํ๋ผ์ด์ฆ ์์ค์์ ์๋ฒ๋ฅผ ๋ฐฐํฌํ ์๋ ์์ต๋๋ค.
| ๋ฒ์ |
๋ก๋ ์์น |
ํ๊ณผ ๊ณต์ |
์ ์ฅ ์์น |
| ๋ก์ปฌ |
ํ์ฌ ํ๋ก์ ํธ๋ง |
์๋์ค |
~/.claude.json |
| ํ๋ก์ ํธ |
ํ์ฌ ํ๋ก์ ํธ๋ง |
์, ๋ฒ์ ์ ์ด๋ฅผ ํตํด |
ํ๋ก์ ํธ ๋ฃจํธ์ .mcp.json |
| ์ฌ์ฉ์ |
๋ชจ๋ ํ๋ก์ ํธ |
์๋์ค |
~/.claude.json |
๋ก์ปฌ ๋ฒ์
๋ก์ปฌ ๋ฒ์๋ ๊ธฐ๋ณธ๊ฐ์
๋๋ค. ๋ก์ปฌ ๋ฒ์ ์๋ฒ๋ ์ถ๊ฐํ ํ๋ก์ ํธ์์๋ง ๋ก๋๋๋ฉฐ ์ฌ์ฉ์์๊ฒ๋ง ๋น๊ณต๊ฐ์
๋๋ค. Claude Code๋ ํด๋น ํ๋ก์ ํธ์ ๊ฒฝ๋ก ์๋ ~/.claude.json์ ์ ์ฅํ๋ฏ๋ก ๋ค๋ฅธ ํ๋ก์ ํธ์๋ ๋์ผํ ์๋ฒ๊ฐ ๋ํ๋์ง ์์ต๋๋ค. ๊ฐ์ธ ๊ฐ๋ฐ ์๋ฒ, ์คํ์ ๊ตฌ์ฑ ๋๋ ๋ฒ์ ์ ์ด์ ํฌํจํ๊ณ ์ถ์ง ์์ ์๊ฒฉ ์ฆ๋ช
์ด ์๋ ์๋ฒ์ ๋ก์ปฌ ๋ฒ์๋ฅผ ์ฌ์ฉํ์ธ์.
claude mcp add --transport http stripe https://mcp.stripe.com
claude mcp add --transport http stripe --scope local https://mcp.stripe.com
/path/to/your/project์์ ์คํํ ๋ ๋ช
๋ น์ ~/.claude.json ๋ด์ ํ์ฌ ํ๋ก์ ํธ ํญ๋ชฉ์ ์๋ฒ๋ฅผ ์์ฑํฉ๋๋ค. ์๋ ์๋ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฌ์ค๋๋ค:
{
"projects": {
"/path/to/your/project": {
"mcpServers": {
"stripe": {
"type": "http",
"url": "https://mcp.stripe.com"
}
}
}
}
}
ํ๋ก์ ํธ ๋ฒ์
ํ๋ก์ ํธ ๋ฒ์ ์๋ฒ๋ ํ๋ก์ ํธ ๋ฃจํธ ๋๋ ํ ๋ฆฌ์ .mcp.json ํ์ผ์ ๊ตฌ์ฑ์ ์ ์ฅํ์ฌ ํ ํ์
์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. ์ด ํ์ผ์ ๋ฒ์ ์ ์ด์ ์ฒดํฌ์ธ๋๋๋ก ์ค๊ณ๋์ด ๋ชจ๋ ํ ๋ฉค๋ฒ๊ฐ ๋์ผํ MCP ๋๊ตฌ ๋ฐ ์๋น์ค์ ์ก์ธ์คํ ์ ์๋๋ก ํฉ๋๋ค. ํ๋ก์ ํธ ๋ฒ์ ์๋ฒ๋ฅผ ์ถ๊ฐํ๋ฉด Claude Code๋ ์๋์ผ๋ก ์ด ํ์ผ์ ์์ฑํ๊ฑฐ๋ ์ ์ ํ ๊ตฌ์ฑ ๊ตฌ์กฐ๋ก ์
๋ฐ์ดํธํฉ๋๋ค.
claude mcp add --transport http paypal --scope project https://mcp.paypal.com/mcp
๊ฒฐ๊ณผ .mcp.json ํ์ผ์ ํ์คํ๋ ํ์์ ๋ฐ๋ฆ
๋๋ค:
{
"mcpServers": {
"shared-server": {
"command": "/path/to/server",
"args": [],
"env": {}
}
}
}
๋ณด์์์ ์ด์ ๋ก Claude Code๋ .mcp.json ํ์ผ์ ํ๋ก์ ํธ ๋ฒ์ ์๋ฒ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ ์ ์น์ธ์ ์์ฒญํฉ๋๋ค. ์ด๋ฌํ ์น์ธ ์ ํ์ ์ฌ์ค์ ํด์ผ ํ๋ ๊ฒฝ์ฐ claude mcp reset-project-choices ๋ช
๋ น์ ์ฌ์ฉํ์ธ์.
์ฌ์ฉ์ ๋ฒ์
์ฌ์ฉ์ ๋ฒ์ ์๋ฒ๋ ~/.claude.json์ ์ ์ฅ๋๋ฉฐ ๊ต์ฐจ ํ๋ก์ ํธ ์ ๊ทผ์ฑ์ ์ ๊ณตํ๋ฏ๋ก ์ปดํจํฐ์ ๋ชจ๋ ํ๋ก์ ํธ์์ ์ฌ์ฉํ ์ ์์ผ๋ฉด์ ์ฌ์ฉ์ ๊ณ์ ์๋ง ๋น๊ณต๊ฐ์
๋๋ค. ์ด ๋ฒ์๋ ๊ฐ์ธ ์ ํธ๋ฆฌํฐ ์๋ฒ, ๊ฐ๋ฐ ๋๊ตฌ ๋๋ ๋ค์ํ ํ๋ก์ ํธ์์ ์์ฃผ ์ฌ์ฉํ๋ ์๋น์ค์ ์ ํฉํฉ๋๋ค.
claude mcp add --transport http hubspot --scope user https://mcp.hubspot.com/anthropic
๋ฒ์ ๊ณ์ธต ๋ฐ ์ฐ์ ์์
๋์ผํ ์๋ฒ๊ฐ ๋ ์ด์์ ์์น์ ์ ์๋๋ฉด Claude Code๋ ๊ฐ์ฅ ๋์ ์ฐ์ ์์ ์์ค์ ์ ์๋ฅผ ์ฌ์ฉํ์ฌ ํ ๋ฒ ์ฐ๊ฒฐํฉ๋๋ค:
- ๋ก์ปฌ ๋ฒ์
- ํ๋ก์ ํธ ๋ฒ์
- ์ฌ์ฉ์ ๋ฒ์
- ํ๋ฌ๊ทธ์ธ ์ ๊ณต ์๋ฒ
- Claude.ai ์ปค๋ฅํฐ
์ธ ๋ฒ์๋ ์ด๋ฆ์ผ๋ก ์ค๋ณต์ ์ผ์น์ํต๋๋ค. ํ๋ฌ๊ทธ์ธ๊ณผ ์ปค๋ฅํฐ๋ ์๋ํฌ์ธํธ๋ก ์ผ์นํ๋ฏ๋ก ์์ ์๋ฒ์ ๋์ผํ URL ๋๋ ๋ช
๋ น์ ๊ฐ๋ฆฌํค๋ ๊ฒ์ ์ค๋ณต์ผ๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค.
.mcp.json์ ํ๊ฒฝ ๋ณ์ ํ์ฅ
Claude Code๋ .mcp.json ํ์ผ์ ํ๊ฒฝ ๋ณ์ ํ์ฅ์ ์ง์ํ๋ฏ๋ก ํ์ด ๊ตฌ์ฑ์ ๊ณต์ ํ๋ฉด์ ๋จธ์ ํน์ ๊ฒฝ๋ก ๋ฐ API ํค์ ๊ฐ์ ๋ฏผ๊ฐํ ๊ฐ์ ๋ํ ์ ์ฐ์ฑ์ ์ ์งํ ์ ์์ต๋๋ค.
์ง์๋๋ ๊ตฌ๋ฌธ:
${VAR} - ํ๊ฒฝ ๋ณ์ VAR์ ๊ฐ์ผ๋ก ํ์ฅ
${VAR:-default} - VAR์ด ์ค์ ๋๋ฉด ํ์ฅ, ๊ทธ๋ ์ง ์์ผ๋ฉด default ์ฌ์ฉ
ํ์ฅ ์์น:
ํ๊ฒฝ ๋ณ์๋ ๋ค์์์ ํ์ฅํ ์ ์์ต๋๋ค:
command - ์๋ฒ ์คํ ํ์ผ ๊ฒฝ๋ก
args - ๋ช
๋ น์ค ์ธ์
env - ์๋ฒ์ ์ ๋ฌ๋๋ ํ๊ฒฝ ๋ณ์
url - HTTP ์๋ฒ ์ ํ์ ๊ฒฝ์ฐ
headers - HTTP ์๋ฒ ์ธ์ฆ์ ๊ฒฝ์ฐ
๋ณ์ ํ์ฅ์ ์ฌ์ฉํ ์:
{
"mcpServers": {
"api-server": {
"type": "http",
"url": "${API_BASE_URL:-https://api.example.com}/mcp",
"headers": {
"Authorization": "Bearer ${API_KEY}"
}
}
}
}
ํ์ ํ๊ฒฝ ๋ณ์๊ฐ ์ค์ ๋์ง ์์๊ณ ๊ธฐ๋ณธ๊ฐ์ด ์์ผ๋ฉด Claude Code๋ ๊ตฌ์ฑ์ ๊ตฌ๋ฌธ ๋ถ์ํ์ง ๋ชปํฉ๋๋ค.
์ค์ ์
{/* ### ์: Playwright๋ก ๋ธ๋ผ์ฐ์ ํ
์คํธ ์๋ํ
claude mcp add --transport stdio playwright -- npx -y @playwright/mcp@latest
๊ทธ๋ฐ ๋ค์ ๋ธ๋ผ์ฐ์ ํ
์คํธ๋ฅผ ์์ฑํ๊ณ ์คํํฉ๋๋ค:
test@example.com์ผ๋ก ๋ก๊ทธ์ธ ํ๋ฆ์ด ์๋ํ๋์ง ํ
์คํธ
๋ชจ๋ฐ์ผ์์ ์ฒดํฌ์์ ํ์ด์ง์ ์คํฌ๋ฆฐ์ท ์ดฌ์
๊ฒ์ ๊ธฐ๋ฅ์ด ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋์ง ํ์ธ
``` */}
### ์: Sentry๋ก ์ค๋ฅ ๋ชจ๋ํฐ๋ง
```bash theme={null}
claude mcp add --transport http sentry https://mcp.sentry.dev/mcp
Sentry ๊ณ์ ์ผ๋ก ์ธ์ฆํฉ๋๋ค:
/mcp
๊ทธ๋ฐ ๋ค์ ํ๋ก๋์
๋ฌธ์ ๋ฅผ ๋๋ฒ๊น
ํฉ๋๋ค:
์ง๋ 24์๊ฐ ๋์ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ์ค๋ฅ๋ ๋ฌด์์
๋๊น?
์ค๋ฅ ID abc123์ ์คํ ์ถ์ ์ ๋ณด์ฌ์ฃผ์ธ์
์ด๋ค ๋ฐฐํฌ๊ฐ ์ด๋ฌํ ์๋ก์ด ์ค๋ฅ๋ฅผ ๋์
ํ์ต๋๊น?
์: ์ฝ๋ ๊ฒํ ๋ฅผ ์ํด GitHub์ ์ฐ๊ฒฐ
GitHub์ ์๊ฒฉ MCP ์๋ฒ๋ ํค๋๋ก ์ ๋ฌ๋ GitHub ๊ฐ์ธ ์ก์ธ์ค ํ ํฐ์ผ๋ก ์ธ์ฆํฉ๋๋ค. ํ๋๋ฅผ ์ป์ผ๋ ค๋ฉด GitHub ํ ํฐ ์ค์ ์ ์ด๊ณ , Claude๊ฐ ์์
ํ๋ ค๋ ๋ฆฌํฌ์งํ ๋ฆฌ์ ์ก์ธ์คํ ์ ์๋ ์๋ก์ด ์ธ๋ถํ๋ ํ ํฐ์ ์์ฑํ ๋ค์ ์๋ฒ๋ฅผ ์ถ๊ฐํ์ธ์:
claude mcp add --transport http github https://api.githubcopilot.com/mcp/ \
--header "Authorization: Bearer YOUR_GITHUB_PAT"
๊ทธ๋ฐ ๋ค์ GitHub๋ก ์์
ํฉ๋๋ค:
PR #456์ ๊ฒํ ํ๊ณ ๊ฐ์ ์ฌํญ์ ์ ์ํ์ธ์
๋ฐฉ๊ธ ๋ฐ๊ฒฌํ ๋ฒ๊ทธ์ ๋ํ ์ ์ด์๋ฅผ ์์ฑํ์ธ์
๋์๊ฒ ํ ๋น๋ ๋ชจ๋ ์ด๋ฆฐ PR์ ๋ณด์ฌ์ฃผ์ธ์
์: PostgreSQL ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ
claude mcp add --transport stdio db -- npx -y @bytebase/dbhub \
--dsn "postgresql://readonly:pass@prod.db.com:5432/analytics"
๊ทธ๋ฐ ๋ค์ ์์ฐ์ค๋ฝ๊ฒ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฟผ๋ฆฌํฉ๋๋ค:
์ด๋ฒ ๋ฌ ์ด ์์ต์ ์ผ๋ง์
๋๊น?
์ฃผ๋ฌธ ํ
์ด๋ธ์ ์คํค๋ง๋ฅผ ๋ณด์ฌ์ฃผ์ธ์
์ง๋ 90์ผ ๋์ ๊ตฌ๋งคํ์ง ์์ ๊ณ ๊ฐ์ ์ฐพ์ผ์ธ์
์๊ฒฉ MCP ์๋ฒ๋ก ์ธ์ฆ
๋ง์ ํด๋ผ์ฐ๋ ๊ธฐ๋ฐ MCP ์๋ฒ๋ ์ธ์ฆ์ด ํ์ํฉ๋๋ค. Claude Code๋ ๋ณด์ ์ฐ๊ฒฐ์ ์ํด OAuth 2.0์ ์ง์ํฉ๋๋ค.
1
์ธ์ฆ์ด ํ์ํ ์๋ฒ ์ถ๊ฐ
์๋ฅผ ๋ค์ด:
claude mcp add --transport http sentry https://mcp.sentry.dev/mcp
2
Claude Code ๋ด์์ /mcp ๋ช
๋ น ์ฌ์ฉ
Claude Code์์ ๋ค์ ๋ช
๋ น์ ์ฌ์ฉํฉ๋๋ค:
/mcp
๊ทธ๋ฐ ๋ค์ ๋ธ๋ผ์ฐ์ ์์ ๋ก๊ทธ์ธ ๋จ๊ณ๋ฅผ ๋ฐ๋ฆ
๋๋ค.
๊ณ ์ OAuth ์ฝ๋ฐฑ ํฌํธ ์ฌ์ฉ
์ผ๋ถ MCP ์๋ฒ๋ ๋ฏธ๋ฆฌ ๋ฑ๋ก๋ ํน์ ๋ฆฌ๋๋ ์
URI๊ฐ ํ์ํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก Claude Code๋ OAuth ์ฝ๋ฐฑ์ ์ํด ๋ฌด์์๋ก ์ฌ์ฉ ๊ฐ๋ฅํ ํฌํธ๋ฅผ ์ ํํฉ๋๋ค. --callback-port๋ฅผ ์ฌ์ฉํ์ฌ ํฌํธ๋ฅผ ๊ณ ์ ํ์ฌ http://localhost:PORT/callback ํ์์ ์ฌ์ ๋ฑ๋ก๋ ๋ฆฌ๋๋ ์
URI์ ์ผ์นํ๋๋ก ํฉ๋๋ค.
--callback-port๋ฅผ ๋จ๋
์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค (๋์ ํด๋ผ์ด์ธํธ ๋ฑ๋ก ํฌํจ) ๋๋ --client-id์ ํจ๊ป ์ฌ์ฉํ ์ ์์ต๋๋ค (์ฌ์ ๊ตฌ์ฑ๋ ์๊ฒฉ ์ฆ๋ช
ํฌํจ).
claude mcp add --transport http \
--callback-port 8080 \
my-server https://mcp.example.com/mcp
์ฌ์ ๊ตฌ์ฑ๋ OAuth ์๊ฒฉ ์ฆ๋ช
์ฌ์ฉ
์ผ๋ถ MCP ์๋ฒ๋ ์๋ OAuth ์ค์ ์ ์ง์ํ์ง ์์ต๋๋ค. "Incompatible auth server: does not support dynamic client registration"๊ณผ ๊ฐ์ ์ค๋ฅ๊ฐ ํ์๋๋ฉด ์๋ฒ์ ์ฌ์ ๊ตฌ์ฑ๋ ์๊ฒฉ ์ฆ๋ช
์ด ํ์ํฉ๋๋ค. Claude Code๋ ๋ํ ๋์ ํด๋ผ์ด์ธํธ ๋ฑ๋ก ๋์ ํด๋ผ์ด์ธํธ ID ๋ฉํ๋ฐ์ดํฐ ๋ฌธ์ (CIMD)๋ฅผ ์ฌ์ฉํ๋ ์๋ฒ๋ฅผ ์ง์ํ๋ฉฐ ์๋์ผ๋ก ๊ฒ์ํฉ๋๋ค. ์๋ ๊ฒ์์ด ์คํจํ๋ฉด ๋จผ์ ์๋ฒ์ ๊ฐ๋ฐ์ ํฌํธ์ ํตํด OAuth ์ฑ์ ๋ฑ๋กํ ๋ค์ ์๋ฒ๋ฅผ ์ถ๊ฐํ ๋ ์๊ฒฉ ์ฆ๋ช
์ ์ ๊ณตํฉ๋๋ค.
1
์๋ฒ๋ก OAuth ์ฑ ๋ฑ๋ก
์๋ฒ์ ๊ฐ๋ฐ์ ํฌํธ์ ํตํด ์ฑ์ ์์ฑํ๊ณ ํด๋ผ์ด์ธํธ ID์ ํด๋ผ์ด์ธํธ ์ํฌ๋ฆฟ์ ๊ธฐ๋กํฉ๋๋ค.
๋ง์ ์๋ฒ๋ ๋ฆฌ๋๋ ์
URI๋ ํ์ํฉ๋๋ค. ๊ทธ๋ ๋ค๋ฉด ํฌํธ๋ฅผ ์ ํํ๊ณ http://localhost:PORT/callback ํ์์ผ๋ก ๋ฆฌ๋๋ ์
URI๋ฅผ ๋ฑ๋กํฉ๋๋ค. ๋ค์ ๋จ๊ณ์์ --callback-port์ ํจ๊ป ๋์ผํ ํฌํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
2
์๊ฒฉ ์ฆ๋ช
์ผ๋ก ์๋ฒ ์ถ๊ฐ
๋ค์ ๋ฐฉ๋ฒ ์ค ํ๋๋ฅผ ์ ํํฉ๋๋ค. --callback-port์ ์ฌ์ฉ๋๋ ํฌํธ๋ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ชจ๋ ํฌํธ์ผ ์ ์์ต๋๋ค. ์ด์ ๋จ๊ณ์์ ๋ฑ๋กํ ๋ฆฌ๋๋ ์
URI์ ์ผ์นํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
--client-id๋ฅผ ์ฌ์ฉํ์ฌ ์ฑ์ ํด๋ผ์ด์ธํธ ID๋ฅผ ์ ๋ฌํฉ๋๋ค. --client-secret ํ๋๊ทธ๋ ๋ง์คํน๋ ์
๋ ฅ์ผ๋ก ์ํฌ๋ฆฟ์ ์์ฒญํฉ๋๋ค:
claude mcp add --transport http \
--client-id your-client-id --client-secret --callback-port 8080 \
my-server https://mcp.example.com/mcp
JSON ๊ตฌ์ฑ์ oauth ๊ฐ์ฒด๋ฅผ ํฌํจํ๊ณ --client-secret์ ๋ณ๋์ ํ๋๊ทธ๋ก ์ ๋ฌํฉ๋๋ค:
claude mcp add-json my-server \
'{"type":"http","url":"https://mcp.example.com/mcp","oauth":{"clientId":"your-client-id","callbackPort":8080}}' \
--client-secret
๋์ ํด๋ผ์ด์ธํธ ๋ฑ๋ก์ ์ฌ์ฉํ๋ฉด์ ํฌํธ๋ฅผ ๊ณ ์ ํ๋ ค๋ฉด ํด๋ผ์ด์ธํธ ID ์์ด --callback-port๋ฅผ ์ฌ์ฉํฉ๋๋ค:
claude mcp add-json my-server \
'{"type":"http","url":"https://mcp.example.com/mcp","oauth":{"callbackPort":8080}}'
ํ๊ฒฝ ๋ณ์๋ฅผ ํตํด ์ํฌ๋ฆฟ์ ์ค์ ํ์ฌ ๋ํํ ํ๋กฌํํธ๋ฅผ ๊ฑด๋๋๋๋ค:
MCP_CLIENT_SECRET=your-secret claude mcp add --transport http \
--client-id your-client-id --client-secret --callback-port 8080 \
my-server https://mcp.example.com/mcp
3
Claude Code์์ ์ธ์ฆ
Claude Code์์ /mcp๋ฅผ ์คํํ๊ณ ๋ธ๋ผ์ฐ์ ๋ก๊ทธ์ธ ํ๋ฆ์ ๋ฐ๋ฆ
๋๋ค.
OAuth ๋ฉํ๋ฐ์ดํฐ ๊ฒ์ ์ฌ์ ์
ํน์ OAuth ์ธ์ฆ ์๋ฒ ๋ฉํ๋ฐ์ดํฐ URL์ ๊ฐ๋ฆฌ์ผ ๊ธฐ๋ณธ ๊ฒ์ ์ฒด์ธ์ ์ฐํํ๋๋ก Claude Code๋ฅผ ์ค์ ํฉ๋๋ค. MCP ์๋ฒ์ ํ์ค ์๋ํฌ์ธํธ๊ฐ ์ค๋ฅ๋ฅผ ๋ฐํํ๊ฑฐ๋ ๋ด๋ถ ํ๋ก์๋ฅผ ํตํด ๊ฒ์์ ๋ผ์ฐํ
ํ๋ ค๋ ๊ฒฝ์ฐ์ ์ค์ ํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก Claude Code๋ ๋จผ์ /.well-known/oauth-protected-resource์์ RFC 9728 ๋ณดํธ๋ ๋ฆฌ์์ค ๋ฉํ๋ฐ์ดํฐ๋ฅผ ํ์ธํ ๋ค์ /.well-known/oauth-authorization-server์์ RFC 8414 ์ธ์ฆ ์๋ฒ ๋ฉํ๋ฐ์ดํฐ๋ก ๋์๊ฐ๋๋ค.
.mcp.json์ ์๋ฒ ๊ตฌ์ฑ์ oauth ๊ฐ์ฒด์ authServerMetadataUrl์ ์ค์ ํฉ๋๋ค:
{
"mcpServers": {
"my-server": {
"type": "http",
"url": "https://mcp.example.com/mcp",
"oauth": {
"authServerMetadataUrl": "https://auth.example.com/.well-known/openid-configuration"
}
}
}
}
URL์ https://๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. authServerMetadataUrl์ Claude Code v2.1.64 ์ด์์ด ํ์ํฉ๋๋ค. ๋ฉํ๋ฐ์ดํฐ URL์ scopes_supported๋ ์
์คํธ๋ฆผ ์๋ฒ๊ฐ ๊ด๊ณ ํ๋ ๋ฒ์๋ฅผ ์ฌ์ ์ํฉ๋๋ค.
OAuth ๋ฒ์ ์ ํ
oauth.scopes๋ฅผ ์ค์ ํ์ฌ ์ธ์ฆ ํ๋ฆ ์ค์ Claude Code๊ฐ ์์ฒญํ๋ ๋ฒ์๋ฅผ ๊ณ ์ ํฉ๋๋ค. ์ด๋ ์
์คํธ๋ฆผ ์ธ์ฆ ์๋ฒ๊ฐ ๊ด๊ณ ํ๋ ๊ฒ๋ณด๋ค ๋ ๋ง์ ๋ฒ์๋ฅผ ๋ถ์ฌํ๊ณ ์ถ์ง ์์ ๋ MCP ์๋ฒ๋ฅผ ๋ณด์ ํ์ด ์น์ธํ ๋ถ๋ถ ์งํฉ์ผ๋ก ์ ํํ๋ ์ง์๋๋ ๋ฐฉ๋ฒ์
๋๋ค. ๊ฐ์ RFC 6749 ยง3.3์ scope ๋งค๊ฐ๋ณ์ ํ์๊ณผ ์ผ์นํ๋ ๋จ์ผ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถ๋ ๋ฌธ์์ด์
๋๋ค.
{
"mcpServers": {
"slack": {
"type": "http",
"url": "https://mcp.slack.com/mcp",
"oauth": {
"scopes": "channels:read chat:write search:read"
}
}
}
}
oauth.scopes๋ authServerMetadataUrl๊ณผ ์๋ฒ๊ฐ /.well-known์์ ๊ฒ์ํ๋ ๋ฒ์ ๋ชจ๋๋ณด๋ค ์ฐ์ ํฉ๋๋ค. ์ค์ ํ์ง ์์ผ๋ฉด MCP ์๋ฒ๊ฐ ์์ฒญ๋ ๋ฒ์ ์งํฉ์ ๊ฒฐ์ ํฉ๋๋ค.
์ธ์ฆ ์๋ฒ๊ฐ scopes_supported์์ offline_access๋ฅผ ๊ด๊ณ ํ๋ฉด Claude Code๋ ์ก์ธ์ค ํ ํฐ์ ์๋ก์ด ๋ธ๋ผ์ฐ์ ๋ก๊ทธ์ธ ์์ด ์๋ก ๊ณ ์น ์ ์๋๋ก ๊ณ ์ ๋ ๋ฒ์์ ์ถ๊ฐํฉ๋๋ค.
์๋ฒ๊ฐ ๋์ค์ ๋๊ตฌ ํธ์ถ์ ๋ํด 403 insufficient_scope์ ๋ฐํํ๋ฉด Claude Code๋ ๋์ผํ ๊ณ ์ ๋ ๋ฒ์๋ก ๋ค์ ์ธ์ฆํฉ๋๋ค. ํ์ํ ๋๊ตฌ๊ฐ ๊ณ ์ ๋ ๋ฒ์ ์ธ์ ๋ฒ์๋ฅผ ์๊ตฌํ ๋ oauth.scopes๋ฅผ ํ๋ํฉ๋๋ค.
์ฌ์ฉ์ ์ ์ ์ธ์ฆ์ ์ํ ๋์ ํค๋ ์ฌ์ฉ
MCP ์๋ฒ๊ฐ OAuth (์: Kerberos, ๋จ๊ธฐ ํ ํฐ ๋๋ ๋ด๋ถ SSO)๊ฐ ์๋ ๋ค๋ฅธ ์ธ์ฆ ์ฒด๊ณ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ headersHelper๋ฅผ ์ฌ์ฉํ์ฌ ์ฐ๊ฒฐ ์๊ฐ์ ์์ฒญ ํค๋๋ฅผ ์์ฑํฉ๋๋ค. Claude Code๋ ๋ช
๋ น์ ์คํํ๊ณ ์ถ๋ ฅ์ ์ฐ๊ฒฐ ํค๋์ ๋ณํฉํฉ๋๋ค.
{
"mcpServers": {
"internal-api": {
"type": "http",
"url": "https://mcp.internal.example.com",
"headersHelper": "/opt/bin/get-mcp-auth-headers.sh"
}
}
}
๋ช
๋ น์ ์ธ๋ผ์ธ์ผ ์๋ ์์ต๋๋ค:
{
"mcpServers": {
"internal-api": {
"type": "http",
"url": "https://mcp.internal.example.com",
"headersHelper": "echo '{\"Authorization\": \"Bearer '\"$(get-token)\"'\"}'"
}
}
}
์๊ตฌ ์ฌํญ:
- ๋ช
๋ น์ JSON ๊ฐ์ฒด์ ๋ฌธ์์ด ํค-๊ฐ ์์ stdout์ ์์ฑํด์ผ ํฉ๋๋ค
- ๋ช
๋ น์ 10์ด ์๊ฐ ์ด๊ณผ๋ฅผ ์ฌ์ฉํ์ฌ ์
ธ์์ ์คํ๋ฉ๋๋ค
- ๋์ ํค๋๋ ๋์ผํ ์ด๋ฆ์ ์ ์
headers๋ฅผ ์ฌ์ ์ํฉ๋๋ค
ํฌํผ๋ ๊ฐ ์ฐ๊ฒฐ (์ธ์
์์ ๋ฐ ์ฌ์ฐ๊ฒฐ ์)์์ ์๋ก ์คํ๋ฉ๋๋ค. ์บ์ฑ์ด ์์ผ๋ฏ๋ก ์คํฌ๋ฆฝํธ๋ ํ ํฐ ์ฌ์ฌ์ฉ์ ๋ด๋นํฉ๋๋ค.
Claude Code๋ ํฌํผ๋ฅผ ์คํํ ๋ ๋ค์ ํ๊ฒฝ ๋ณ์๋ฅผ ์ค์ ํฉ๋๋ค:
| ๋ณ์ |
๊ฐ |
CLAUDE_CODE_MCP_SERVER_NAME |
MCP ์๋ฒ์ ์ด๋ฆ |
CLAUDE_CODE_MCP_SERVER_URL |
MCP ์๋ฒ์ URL |
์ด๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ MCP ์๋ฒ๋ฅผ ์ ๊ณตํ๋ ๋จ์ผ ํฌํผ ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํฉ๋๋ค.
JSON ๊ตฌ์ฑ์์ MCP ์๋ฒ ์ถ๊ฐ
MCP ์๋ฒ์ ๋ํ JSON ๊ตฌ์ฑ์ด ์๋ ๊ฒฝ์ฐ ์ง์ ์ถ๊ฐํ ์ ์์ต๋๋ค:
1
JSON์์ MCP ์๋ฒ ์ถ๊ฐ
claude mcp add-json <name> '<json>'
claude mcp add-json weather-api '{"type":"http","url":"https://api.weather.com/mcp","headers":{"Authorization":"Bearer token"}}'
claude mcp add-json local-weather '{"type":"stdio","command":"/path/to/weather-cli","args":["--api-key","abc123"],"env":{"CACHE_DIR":"/tmp"}}'
claude mcp add-json my-server '{"type":"http","url":"https://mcp.example.com/mcp","oauth":{"clientId":"your-client-id","callbackPort":8080}}' --client-secret
2
์๋ฒ๊ฐ ์ถ๊ฐ๋์๋์ง ํ์ธ
claude mcp get weather-api
Claude Desktop์์ MCP ์๋ฒ ๊ฐ์ ธ์ค๊ธฐ
Claude Desktop์์ MCP ์๋ฒ๋ฅผ ์ด๋ฏธ ๊ตฌ์ฑํ ๊ฒฝ์ฐ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค:
1
Claude Desktop์์ ์๋ฒ ๊ฐ์ ธ์ค๊ธฐ
claude mcp add-from-claude-desktop
2
๊ฐ์ ธ์ฌ ์๋ฒ ์ ํ
๋ช
๋ น์ ์คํํ ํ ๊ฐ์ ธ์ฌ ์๋ฒ๋ฅผ ์ ํํ ์ ์๋ ๋ํํ ๋ํ ์์๊ฐ ํ์๋ฉ๋๋ค.
3
์๋ฒ๊ฐ ๊ฐ์ ธ์์ก๋์ง ํ์ธ
claude mcp list
Claude.ai์์ MCP ์๋ฒ ์ฌ์ฉ
Claude.ai ๊ณ์ ์ผ๋ก Claude Code์ ๋ก๊ทธ์ธํ ๊ฒฝ์ฐ Claude.ai์์ ์ถ๊ฐํ MCP ์๋ฒ๋ Claude Code์์ ์๋์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค:
1
Claude.ai์์ MCP ์๋ฒ ๊ตฌ์ฑ
claude.ai/customize/connectors์์ ์๋ฒ๋ฅผ ์ถ๊ฐํฉ๋๋ค. Team ๋ฐ Enterprise ํ๋์์๋ ๊ด๋ฆฌ์๋ง ์๋ฒ๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค.
2
MCP ์๋ฒ ์ธ์ฆ
Claude.ai์์ ํ์ํ ์ธ์ฆ ๋จ๊ณ๋ฅผ ์๋ฃํฉ๋๋ค.
3
Claude Code์์ ์๋ฒ ๋ณด๊ธฐ ๋ฐ ๊ด๋ฆฌ
Claude Code์์ ๋ค์ ๋ช
๋ น์ ์ฌ์ฉํฉ๋๋ค:
/mcp
Claude.ai ์๋ฒ๋ Claude.ai์์ ์จ ๊ฒ์ ๋ํ๋ด๋ ํ์๊ธฐ์ ํจ๊ป ๋ชฉ๋ก์ ๋ํ๋ฉ๋๋ค.
Claude Code์์ ์ถ๊ฐํ ์๋ฒ๋ ๋์ผํ URL์ ๊ฐ๋ฆฌํค๋ claude.ai ์ปค๋ฅํฐ๋ณด๋ค ์ฐ์ ์์๋ฅผ ๊ฐ์ต๋๋ค. ์ด ๊ฒฝ์ฐ /mcp๋ ์ปค๋ฅํฐ๋ฅผ ์จ๊น์ผ๋ก ํ์ํ๊ณ ์ปค๋ฅํฐ๋ฅผ ์ฌ์ฉํ๋ ค๋ ๊ฒฝ์ฐ ์ค๋ณต์ ์ ๊ฑฐํ๋ ๋ฐฉ๋ฒ์ ํ์ํฉ๋๋ค.
Claude Code์์ claude.ai MCP ์๋ฒ๋ฅผ ๋นํ์ฑํํ๋ ค๋ฉด ENABLE_CLAUDEAI_MCP_SERVERS ํ๊ฒฝ ๋ณ์๋ฅผ false๋ก ์ค์ ํฉ๋๋ค:
ENABLE_CLAUDEAI_MCP_SERVERS=false claude
Claude Code๋ฅผ MCP ์๋ฒ๋ก ์ฌ์ฉ
Claude Code ์์ฒด๋ฅผ ๋ค๋ฅธ ์ ํ๋ฆฌ์ผ์ด์
์ด ์ฐ๊ฒฐํ ์ ์๋ MCP ์๋ฒ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค:
claude mcp serve
claude_desktop_config.json์ ์ด ๊ตฌ์ฑ์ ์ถ๊ฐํ์ฌ Claude Desktop์์ ์ฌ์ฉํ ์ ์์ต๋๋ค:
{
"mcpServers": {
"claude-code": {
"type": "stdio",
"command": "claude",
"args": ["mcp", "serve"],
"env": {}
}
}
}
MCP ์ถ๋ ฅ ์ ํ ๋ฐ ๊ฒฝ๊ณ
MCP ๋๊ตฌ๊ฐ ํฐ ์ถ๋ ฅ์ ์์ฑํ ๋ Claude Code๋ ํ ํฐ ์ฌ์ฉ๋์ ๊ด๋ฆฌํ์ฌ ๋ํ ์ปจํ
์คํธ๊ฐ ์๋๋์ง ์๋๋ก ํฉ๋๋ค:
- ์ถ๋ ฅ ๊ฒฝ๊ณ ์๊ณ๊ฐ: Claude Code๋ MCP ๋๊ตฌ ์ถ๋ ฅ์ด 10,000 ํ ํฐ์ ์ด๊ณผํ ๋ ๊ฒฝ๊ณ ๋ฅผ ํ์ํฉ๋๋ค
- ๊ตฌ์ฑ ๊ฐ๋ฅํ ์ ํ:
MAX_MCP_OUTPUT_TOKENS ํ๊ฒฝ ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ์ต๋ ํ์ฉ MCP ์ถ๋ ฅ ํ ํฐ์ ์กฐ์ ํ ์ ์์ต๋๋ค
- ๊ธฐ๋ณธ ์ ํ: ๊ธฐ๋ณธ ์ต๋๊ฐ์ 25,000 ํ ํฐ์
๋๋ค
- ๋ฒ์: ํ๊ฒฝ ๋ณ์๋ ์์ ์ ์ ํ์ ์ ์ธํ์ง ์๋ ๋๊ตฌ์ ์ ์ฉ๋ฉ๋๋ค.
anthropic/maxResultSizeChars๋ฅผ ์ค์ ํ๋ ๋๊ตฌ๋ MAX_MCP_OUTPUT_TOKENS์ด ์ค์ ๋ ๊ฒ๊ณผ ๊ด๊ณ์์ด ํ
์คํธ ์ฝํ
์ธ ์ ๋ํด ํด๋น ๊ฐ์ ์ฌ์ฉํฉ๋๋ค. ์ด๋ฏธ์ง ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ๋ ๋๊ตฌ๋ ์ฌ์ ํ MAX_MCP_OUTPUT_TOKENS์ ์ํฅ์ ๋ฐ์ต๋๋ค
ํฐ ์ถ๋ ฅ์ ์์ฑํ๋ ๋๊ตฌ์ ์ ํ์ ๋๋ฆฌ๋ ค๋ฉด:
export MAX_MCP_OUTPUT_TOKENS=50000
claude
์ด๋ ๋ค์์ ์ํํ๋ MCP ์๋ฒ๋ก ์์
ํ ๋ ํนํ ์ ์ฉํฉ๋๋ค:
- ๋๊ท๋ชจ ๋ฐ์ดํฐ ์ธํธ ๋๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ
- ์์ธํ ๋ณด๊ณ ์ ๋๋ ๋ฌธ์ ์์ฑ
- ๊ด๋ฒ์ํ ๋ก๊ทธ ํ์ผ ๋๋ ๋๋ฒ๊น
์ ๋ณด ์ฒ๋ฆฌ
ํน์ ๋๊ตฌ์ ์ ํ ๋๋ฆฌ๊ธฐ
MCP ์๋ฒ๋ฅผ ๊ตฌ์ถํ๋ ๊ฒฝ์ฐ ๋๊ตฌ์ tools/list ์๋ต ํญ๋ชฉ์์ _meta["anthropic/maxResultSizeChars"]๋ฅผ ์ค์ ํ์ฌ ๊ฐ๋ณ ๋๊ตฌ๊ฐ ๊ธฐ๋ณธ ๋์คํฌ ์ ์ง ์๊ณ๊ฐ๋ณด๋ค ํฐ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ ์ ์์ต๋๋ค. Claude Code๋ ํด๋น ๋๊ตฌ์ ์๊ณ๊ฐ์ ์ฃผ์ ์ฒ๋ฆฌ๋ ๊ฐ์ผ๋ก ์ฌ๋ฆฝ๋๋ค (์ต๋ 500,000์์ ํ๋ ์ํ๊น์ง).
์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง ๋๋ ์ ์ฒด ํ์ผ ํธ๋ฆฌ์ ๊ฐ์ด ๋ณธ์ง์ ์ผ๋ก ํฌ์ง๋ง ํ์ํ ์ถ๋ ฅ์ ๋ฐํํ๋ ๋๊ตฌ์ ์ ์ฉํฉ๋๋ค. ์ฃผ์ ์ฒ๋ฆฌ ์์ด ๊ธฐ๋ณธ ์๊ณ๊ฐ์ ์ด๊ณผํ๋ ๊ฒฐ๊ณผ๋ ๋์คํฌ์ ์ ์ง๋๊ณ ๋ํ์์ ํ์ผ ์ฐธ์กฐ๋ก ๋์ฒด๋ฉ๋๋ค.
{
"name": "get_schema",
"description": "Returns the full database schema",
"_meta": {
"anthropic/maxResultSizeChars": 200000
}
}
์ฃผ์ ์ฒ๋ฆฌ๋ ํ
์คํธ ์ฝํ
์ธ ์ ๋ํด MAX_MCP_OUTPUT_TOKENS๊ณผ ๋
๋ฆฝ์ ์ผ๋ก ์ ์ฉ๋๋ฏ๋ก ์ฌ์ฉ์๋ ๋๊ตฌ๊ฐ ์ ์ธํ๋ ๋๊ตฌ์ ๋ํด ํ๊ฒฝ ๋ณ์๋ฅผ ์ฌ๋ฆด ํ์๊ฐ ์์ต๋๋ค. ์ด๋ฏธ์ง ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ๋ ๋๊ตฌ๋ ์ฌ์ ํ ํ ํฐ ์ ํ์ ์ํฅ์ ๋ฐ์ต๋๋ค.
MCP ๋ฆฌ์์ค ์์ฒญ์ ์๋ต
MCP ์๋ฒ๋ ์์
์ค์ ๊ตฌ์กฐํ๋ ์
๋ ฅ์ ์์ฒญํ ์ ์์ต๋๋ค. ์๋ฒ๊ฐ ์์ฒด์ ์ผ๋ก ์ป์ ์ ์๋ ์ ๋ณด๊ฐ ํ์ํ ๋ Claude Code๋ ๋ํํ ๋ํ ์์๋ฅผ ํ์ํ๊ณ ์๋ต์ ์๋ฒ์ ๋ค์ ์ ๋ฌํฉ๋๋ค. ์ฌ์ฉ์ ์ธก์์ ๊ตฌ์ฑ์ด ํ์ํ์ง ์์ต๋๋ค: ์๋ฒ๊ฐ ์์ฒญํ ๋ ๋ฆฌ์์ค ์์ฒญ ๋ํ ์์๊ฐ ์๋์ผ๋ก ๋ํ๋ฉ๋๋ค.
์๋ฒ๋ ๋ ๊ฐ์ง ๋ฐฉ์์ผ๋ก ์
๋ ฅ์ ์์ฒญํ ์ ์์ต๋๋ค:
- ์์ ๋ชจ๋: Claude Code๋ ์๋ฒ์์ ์ ์ํ ์์ ํ๋๊ฐ ์๋ ๋ํ ์์๋ฅผ ํ์ํฉ๋๋ค (์: ์ฌ์ฉ์ ์ด๋ฆ ๋ฐ ์ํธ ํ๋กฌํํธ). ํ๋๋ฅผ ์
๋ ฅํ๊ณ ์ ์ถํฉ๋๋ค.
- URL ๋ชจ๋: Claude Code๋ ์ธ์ฆ ๋๋ ์น์ธ์ ์ํด ๋ธ๋ผ์ฐ์ URL์ ์ฝ๋๋ค. ๋ธ๋ผ์ฐ์ ์์ ํ๋ฆ์ ์๋ฃํ ๋ค์ CLI์์ ํ์ธํฉ๋๋ค.
๋ฆฌ์์ค ์์ฒญ์ ์๋์ผ๋ก ์๋ตํ๋ ค๋ฉด Elicitation ํ
์ ์ฌ์ฉํ์ธ์.
๋ฆฌ์์ค ์์ฒญ์ ์ฌ์ฉํ๋ MCP ์๋ฒ๋ฅผ ๊ตฌ์ถํ๋ ๊ฒฝ์ฐ MCP ๋ฆฌ์์ค ์์ฒญ ์ฌ์์์ ํ๋กํ ์ฝ ์ธ๋ถ ์ ๋ณด ๋ฐ ์คํค๋ง ์๋ฅผ ์ฐธ์กฐํ์ธ์.
MCP ๋ฆฌ์์ค ์ฌ์ฉ
MCP ์๋ฒ๋ ํ์ผ์ ์ฐธ์กฐํ๋ ๋ฐฉ์๊ณผ ์ ์ฌํ๊ฒ @ ๋ฉ์
์ ์ฌ์ฉํ์ฌ ์ฐธ์กฐํ ์ ์๋ ๋ฆฌ์์ค๋ฅผ ๋
ธ์ถํ ์ ์์ต๋๋ค.
MCP ๋ฆฌ์์ค ์ฐธ์กฐ
1
์ฌ์ฉ ๊ฐ๋ฅํ ๋ฆฌ์์ค ๋์ด
ํ๋กฌํํธ์ @๋ฅผ ์
๋ ฅํ์ฌ ์ฐ๊ฒฐ๋ ๋ชจ๋ MCP ์๋ฒ์ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฆฌ์์ค๋ฅผ ํ์ธํฉ๋๋ค. ๋ฆฌ์์ค๋ ์๋ ์์ฑ ๋ฉ๋ด์ ํ์ผ๊ณผ ํจ๊ป ๋ํ๋ฉ๋๋ค.
2
ํน์ ๋ฆฌ์์ค ์ฐธ์กฐ
@server:protocol://resource/path ํ์์ ์ฌ์ฉํ์ฌ ๋ฆฌ์์ค๋ฅผ ์ฐธ์กฐํฉ๋๋ค:
@github:issue://123์ ๋ถ์ํ๊ณ ์์ ์ฌํญ์ ์ ์ํ ์ ์๋์?
@docs:file://api/authentication์ API ๋ฌธ์๋ฅผ ๊ฒํ ํด ์ฃผ์ธ์
3
์ฌ๋ฌ ๋ฆฌ์์ค ์ฐธ์กฐ
๋จ์ผ ํ๋กฌํํธ์์ ์ฌ๋ฌ ๋ฆฌ์์ค๋ฅผ ์ฐธ์กฐํ ์ ์์ต๋๋ค:
@postgres:schema://users์ @docs:file://database/user-model์ ๋น๊ตํ์ธ์
Tool Search๋ MCP ์ปจํ
์คํธ ์ฌ์ฉ๋์ ๋ฎ๊ฒ ์ ์งํ์ฌ ๋๊ตฌ ์ ์๋ฅผ Claude๊ฐ ํ์ํ ๋๊น์ง ์ฐ๊ธฐํฉ๋๋ค. ์ธ์
์์ ์ ๋๊ตฌ ์ด๋ฆ๋ง ๋ก๋๋๋ฏ๋ก ๋ ๋ง์ MCP ์๋ฒ๋ฅผ ์ถ๊ฐํด๋ ์ปจํ
์คํธ ์๋์ฐ์ ๋ฏธ์น๋ ์ํฅ์ด ์ต์ํ๋ฉ๋๋ค.
์๋ ๋ฐฉ์
Tool Search๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฑํ๋ฉ๋๋ค. MCP ๋๊ตฌ๋ ๋ฏธ๋ฆฌ ๋ก๋๋์ง ์๊ณ ์ฐ๊ธฐ๋๋ฉฐ, Claude๋ ๊ฒ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์์
์ ํ์ํ ๋ ๊ด๋ จ ๋๊ตฌ๋ฅผ ๊ฒ์ํฉ๋๋ค. Claude๊ฐ ์ค์ ๋ก ์ฌ์ฉํ๋ ๋๊ตฌ๋ง ์ปจํ
์คํธ์ ๋ค์ด๊ฐ๋๋ค. ์ฌ์ฉ์ ๊ด์ ์์ MCP ๋๊ตฌ๋ ์ด์ ๊ณผ ์ ํํ ๋์ผํ๊ฒ ์๋ํฉ๋๋ค.
์๊ณ๊ฐ ๊ธฐ๋ฐ ๋ก๋ฉ์ ์ ํธํ๋ ๊ฒฝ์ฐ ENABLE_TOOL_SEARCH=auto๋ฅผ ์ค์ ํ์ฌ ์ปจํ
์คํธ ์๋์ฐ์ 10% ์ด๋ด์ ๋ง์ ๋ ์คํค๋ง๋ฅผ ๋ฏธ๋ฆฌ ๋ก๋ํ๊ณ ์ค๋ฒํ๋ก์ฐ๋ง ์ฐ๊ธฐํฉ๋๋ค. ๋ชจ๋ ์ต์
์ Tool Search ๊ตฌ์ฑ์ ์ฐธ์กฐํ์ธ์.
MCP ์๋ฒ ์์ฑ์์ฉ
MCP ์๋ฒ๋ฅผ ๊ตฌ์ถํ๋ ๊ฒฝ์ฐ Tool Search๊ฐ ํ์ฑํ๋๋ฉด ์๋ฒ ์ง์นจ ํ๋๊ฐ ๋ ์ ์ฉํด์ง๋๋ค. ์๋ฒ ์ง์นจ์ Claude๊ฐ skills์ ์๋ ๋ฐฉ์๊ณผ ์ ์ฌํ๊ฒ ๋๊ตฌ๋ฅผ ๊ฒ์ํ ์๊ธฐ๋ฅผ ์ดํดํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
๋ค์์ ์ค๋ช
ํ๋ ๋ช
ํํ๊ณ ์ค๋ช
์ ์ธ ์๋ฒ ์ง์นจ์ ์ถ๊ฐํฉ๋๋ค:
- ๋๊ตฌ๊ฐ ์ฒ๋ฆฌํ๋ ์์
์ ๋ฒ์ฃผ
- Claude๊ฐ ๋๊ตฌ๋ฅผ ๊ฒ์ํด์ผ ํ ๋
- ์๋ฒ๊ฐ ์ ๊ณตํ๋ ์ฃผ์ ๊ธฐ๋ฅ
Claude Code๋ ๋๊ตฌ ์ค๋ช
๋ฐ ์๋ฒ ์ง์นจ์ ๊ฐ๊ฐ 2KB์์ ์๋ฆ
๋๋ค. ์๋ฅด๊ธฐ๋ฅผ ํผํ๋ ค๋ฉด ๊ฐ๊ฒฐํ๊ฒ ์ ์งํ๊ณ ์ค์ํ ์ธ๋ถ ์ ๋ณด๋ฅผ ์์ ๋ถ๋ถ์ ๋ฐฐ์นํฉ๋๋ค.
Tool Search๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฑํ๋ฉ๋๋ค: MCP ๋๊ตฌ๋ ์ฐ๊ธฐ๋๊ณ ํ์์ ๋ฐ๋ผ ๊ฒ์๋ฉ๋๋ค. Vertex AI์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋นํ์ฑํ๋์ด ์์ต๋๋ค(๋๊ตฌ ๊ฒ์ ๋ฒ ํ ํค๋๋ฅผ ํ์ฉํ์ง ์์). ANTHROPIC_BASE_URL์ด ๋น ์์ฌ ํธ์คํธ๋ฅผ ๊ฐ๋ฆฌํฌ ๋๋ ๋นํ์ฑํ๋ฉ๋๋ค(๋๋ถ๋ถ์ ํ๋ก์๊ฐ tool_reference ๋ธ๋ก์ ์ ๋ฌํ์ง ์๊ธฐ ๋๋ฌธ). ๋ช
์์ ์ผ๋ก ENABLE_TOOL_SEARCH๋ฅผ ์ค์ ํ์ฌ ์ตํธ์ธํฉ๋๋ค. ์ด ๊ธฐ๋ฅ์ tool_reference ๋ธ๋ก์ ์ง์ํ๋ ๋ชจ๋ธ์ด ํ์ํฉ๋๋ค: Sonnet 4 ์ด์ ๋๋ Opus 4 ์ด์. Haiku ๋ชจ๋ธ์ Tool Search๋ฅผ ์ง์ํ์ง ์์ต๋๋ค.
ENABLE_TOOL_SEARCH ํ๊ฒฝ ๋ณ์๋ก Tool Search ๋์์ ์ ์ดํฉ๋๋ค:
| ๊ฐ |
๋์ |
| (์ค์ ๋์ง ์์) |
๋ชจ๋ MCP ๋๊ตฌ ์ฐ๊ธฐ๋๊ณ ํ์์ ๋ฐ๋ผ ๋ก๋๋จ. Vertex AI ๋๋ ANTHROPIC_BASE_URL์ด ๋น ์์ฌ ํธ์คํธ์ผ ๋ ๋ฏธ๋ฆฌ ๋ก๋๋ก ๋์๊ฐ |
true |
๋ชจ๋ MCP ๋๊ตฌ ์ฐ๊ธฐ, Vertex AI ๋ฐ ๋น ์์ฌ ANTHROPIC_BASE_URL ํฌํจ |
auto |
์๊ณ๊ฐ ๋ชจ๋: ๋๊ตฌ๊ฐ ์ปจํ
์คํธ ์๋์ฐ์ 10% ์ด๋ด์ ๋ง์ผ๋ฉด ๋ฏธ๋ฆฌ ๋ก๋, ๊ทธ๋ ์ง ์์ผ๋ฉด ์ฐ๊ธฐ |
auto:<N> |
์ฌ์ฉ์ ์ ์ ๋ฐฑ๋ถ์จ์ ์ฌ์ฉํ ์๊ณ๊ฐ ๋ชจ๋, <N>์ 0-100 (์: auto:5๋ 5%) |
false |
๋ชจ๋ MCP ๋๊ตฌ ๋ฏธ๋ฆฌ ๋ก๋, ์ฐ๊ธฐ ์์ |
ENABLE_TOOL_SEARCH=auto:5 claude
ENABLE_TOOL_SEARCH=false claude
๋๋ settings.json env ํ๋์์ ๊ฐ์ ์ค์ ํฉ๋๋ค.
ToolSearch ๋๊ตฌ๋ฅผ ํน๋ณํ ๋นํ์ฑํํ ์๋ ์์ต๋๋ค:
{
"permissions": {
"deny": ["ToolSearch"]
}
}
์๋ฒ๋ฅผ ์ฐ๊ธฐ์์ ์ ์ธ
์๋ฒ์ ๋๊ตฌ๊ฐ ๊ฒ์ ๋จ๊ณ ์์ด ํญ์ Claude์๊ฒ ํ์๋์ด์ผ ํ๋ ๊ฒฝ์ฐ ํด๋น ์๋ฒ์ ๊ตฌ์ฑ์์ alwaysLoad๋ฅผ true๋ก ์ค์ ํฉ๋๋ค. ๊ทธ๋ฌ๋ฉด ENABLE_TOOL_SEARCH ์ค์ ์ ๊ด๊ณ์์ด ํด๋น ์๋ฒ์ ๋ชจ๋ ๋๊ตฌ๊ฐ ์ธ์
์์ ์ ์ปจํ
์คํธ์ ๋ก๋๋ฉ๋๋ค. ๋งค ํด๋ง๋ค Claude๊ฐ ํ์๋ก ํ๋ ์์์ ๋๊ตฌ์ ์ด๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๊ฐ ๋ฏธ๋ฆฌ ๋ก๋๋ ๋๊ตฌ๋ ๋ํ์ ์ฌ์ฉํ ์ ์๋ ์ปจํ
์คํธ๋ฅผ ์๋นํ๊ธฐ ๋๋ฌธ์
๋๋ค.
๋ค์ .mcp.json ํญ๋ชฉ์ ํ HTTP ์๋ฒ๋ฅผ ์ ์ธํ๋ฉด์ ๋ค๋ฅธ ์๋ฒ๋ ์ฐ๊ธฐ๋ ์ํ๋ก ์ ์งํฉ๋๋ค:
{
"mcpServers": {
"core-tools": {
"type": "http",
"url": "https://mcp.example.com/mcp",
"alwaysLoad": true
}
}
}
alwaysLoad ํ๋๋ ๋ชจ๋ ์๋ฒ ์ ํ์์ ์ฌ์ฉ ๊ฐ๋ฅํ๋ฉฐ Claude Code v2.1.121 ์ด์์ด ํ์ํฉ๋๋ค. MCP ์๋ฒ๋ ๋๊ตฌ์ _meta ๊ฐ์ฒด์ "anthropic/alwaysLoad": true๋ฅผ ํฌํจํ์ฌ ๊ฐ๋ณ ๋๊ตฌ๋ฅผ ํญ์ ๋ก๋๋๋๋ก ํ์ํ ์๋ ์์ผ๋ฉฐ, ์ด๋ ํด๋น ๋๊ตฌ์๋ง ๋์ผํ ํจ๊ณผ๋ฅผ ๊ฐ์ต๋๋ค.
alwaysLoad: true๋ฅผ ์ค์ ํ๋ฉด ์๋ฒ๊ฐ ์ฐ๊ฒฐ๋ ๋๊น์ง ์์์ด ์ฐจ๋จ๋๋ฉฐ, ํ์ค 5์ด ์ฐ๊ฒฐ ํ์์์์ผ๋ก ์ ํ๋ฉ๋๋ค. ์ด๋ MCP_CONNECTION_NONBLOCKING=1์ด ์ค์ ๋ ๊ฒฝ์ฐ์๋ ์ ์ฉ๋ฉ๋๋ค. ์ฒซ ๋ฒ์งธ ํ๋กฌํํธ๊ฐ ๋น๋๋ ๋ ๋๊ตฌ๊ฐ ์์ด์ผ ํ๊ธฐ ๋๋ฌธ์
๋๋ค. ๋น์ฐจ๋จ์ด ํ์ฑํ๋ ๊ฒฝ์ฐ ๋ค๋ฅธ ์๋ฒ๋ ์ฌ์ ํ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์ฐ๊ฒฐ๋ฉ๋๋ค.
MCP ํ๋กฌํํธ๋ฅผ ๋ช
๋ น์ผ๋ก ์ฌ์ฉ
MCP ์๋ฒ๋ Claude Code์์ ๋ช
๋ น์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ๊ฒ ๋๋ ํ๋กฌํํธ๋ฅผ ๋
ธ์ถํ ์ ์์ต๋๋ค.
MCP ํ๋กฌํํธ ์คํ
1
์ฌ์ฉ ๊ฐ๋ฅํ ํ๋กฌํํธ ๊ฒ์
/๋ฅผ ์
๋ ฅํ์ฌ MCP ์๋ฒ์ ํ๋กฌํํธ๋ฅผ ํฌํจํ ๋ชจ๋ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ช
๋ น์ ํ์ธํฉ๋๋ค. MCP ํ๋กฌํํธ๋ /mcp__servername__promptname ํ์์ผ๋ก ๋ํ๋ฉ๋๋ค.
2
์ธ์ ์์ด ํ๋กฌํํธ ์คํ
/mcp__github__list_prs
3
์ธ์๋ฅผ ์ฌ์ฉํ์ฌ ํ๋กฌํํธ ์คํ
๋ง์ ํ๋กฌํํธ๋ ์ธ์๋ฅผ ํ์ฉํฉ๋๋ค. ๋ช
๋ น ๋ค์ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถํ์ฌ ์ ๋ฌํฉ๋๋ค:
/mcp__github__pr_review 456
/mcp__jira__create_issue "๋ก๊ทธ์ธ ํ๋ฆ์ ๋ฒ๊ทธ" high
๊ด๋ฆฌ๋๋ MCP ๊ตฌ์ฑ
MCP ์๋ฒ์ ๋ํ ์ค์ ์ง์ค์ ์ ์ด๊ฐ ํ์ํ ์กฐ์ง์ ๊ฒฝ์ฐ Claude Code๋ ๋ ๊ฐ์ง ๊ตฌ์ฑ ์ต์
์ ์ง์ํฉ๋๋ค:
managed-mcp.json์ ์ฌ์ฉํ ๋
์ ์ ์ด: ์ฌ์ฉ์๊ฐ ์์ ํ๊ฑฐ๋ ํ์ฅํ ์ ์๋ ๊ณ ์ ๋ MCP ์๋ฒ ์ธํธ ๋ฐฐํฌ
- ํ์ฉ ๋ชฉ๋ก/๊ฑฐ๋ถ ๋ชฉ๋ก์ ์ฌ์ฉํ ์ ์ฑ
๊ธฐ๋ฐ ์ ์ด: ์ฌ์ฉ์๊ฐ ์์ ์ ์๋ฒ๋ฅผ ์ถ๊ฐํ ์ ์์ง๋ง ํ์ฉ๋๋ ์๋ฒ๋ฅผ ์ ํ
์ด๋ฌํ ์ต์
์ ํตํด IT ๊ด๋ฆฌ์๋ ๋ค์์ ์ํํ ์ ์์ต๋๋ค:
- ์ง์์ด ์ก์ธ์คํ ์ ์๋ MCP ์๋ฒ ์ ์ด: ์กฐ์ง ์ ์ฒด์ ํ์คํ๋ ์น์ธ๋ MCP ์๋ฒ ์ธํธ ๋ฐฐํฌ
- ์น์ธ๋์ง ์์ MCP ์๋ฒ ๋ฐฉ์ง: ์ฌ์ฉ์๊ฐ ์น์ธ๋์ง ์์ MCP ์๋ฒ๋ฅผ ์ถ๊ฐํ์ง ๋ชปํ๋๋ก ์ ํ
- MCP ์์ ํ ๋นํ์ฑํ: ํ์ํ ๊ฒฝ์ฐ MCP ๊ธฐ๋ฅ์ ์์ ํ ์ ๊ฑฐ
์ต์
1: managed-mcp.json์ ์ฌ์ฉํ ๋
์ ์ ์ด
managed-mcp.json ํ์ผ์ ๋ฐฐํฌํ๋ฉด ๋ชจ๋ MCP ์๋ฒ์ ๋ํ ๋
์ ์ ์ด๋ฅผ ๊ฐ์ต๋๋ค. ์ฌ์ฉ์๋ ์ด ํ์ผ์ ์ ์๋ ์๋ฒ ์ด์ธ์ MCP ์๋ฒ๋ฅผ ์ถ๊ฐ, ์์ ๋๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ ์์ ํ ์ ์ด๋ฅผ ์ํ๋ ์กฐ์ง์ ๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฉ๋ฒ์
๋๋ค.
์์คํ
๊ด๋ฆฌ์๋ ๊ตฌ์ฑ ํ์ผ์ ์์คํ
์ ์ฒด ๋๋ ํ ๋ฆฌ์ ๋ฐฐํฌํฉ๋๋ค:
- macOS:
/Library/Application Support/ClaudeCode/managed-mcp.json
- Linux ๋ฐ WSL:
/etc/claude-code/managed-mcp.json
- Windows:
C:\Program Files\ClaudeCode\managed-mcp.json
managed-mcp.json ํ์ผ์ ํ์ค .mcp.json ํ์ผ๊ณผ ๋์ผํ ํ์์ ์ฌ์ฉํฉ๋๋ค:
{
"mcpServers": {
"github": {
"type": "http",
"url": "https://api.githubcopilot.com/mcp/"
},
"sentry": {
"type": "http",
"url": "https://mcp.sentry.dev/mcp"
},
"company-internal": {
"type": "stdio",
"command": "/usr/local/bin/company-mcp-server",
"args": ["--config", "/etc/company/mcp-config.json"],
"env": {
"COMPANY_API_URL": "https://internal.company.com"
}
}
}
}
์ต์
2: ํ์ฉ ๋ชฉ๋ก ๋ฐ ๊ฑฐ๋ถ ๋ชฉ๋ก์ ์ฌ์ฉํ ์ ์ฑ
๊ธฐ๋ฐ ์ ์ด
๋
์ ์ ์ด๋ฅผ ํ๋ ๋์ ๊ด๋ฆฌ์๋ ์ฌ์ฉ์๊ฐ ์์ ์ MCP ์๋ฒ๋ฅผ ๊ตฌ์ฑํ ์ ์๋๋ก ํ์ฉํ๋ฉด์ ํ์ฉ๋๋ ์๋ฒ์ ์ ํ์ ์ ์ฉํ ์ ์์ต๋๋ค. ์ด ๋ฐฉ๋ฒ์ ๊ด๋ฆฌ๋๋ ์ค์ ํ์ผ์ allowedMcpServers ๋ฐ deniedMcpServers๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ ํ ์ต์
ํ์ฉ ๋ชฉ๋ก ๋๋ ๊ฑฐ๋ถ ๋ชฉ๋ก์ ๊ฐ ํญ๋ชฉ์ ์ธ ๊ฐ์ง ๋ฐฉ์์ผ๋ก ์๋ฒ๋ฅผ ์ ํํ ์ ์์ต๋๋ค:
- ์๋ฒ ์ด๋ฆ์ผ๋ก (
serverName): ์๋ฒ์ ๊ตฌ์ฑ๋ ์ด๋ฆ๊ณผ ์ผ์น
- ๋ช
๋ น์ผ๋ก (
serverCommand): stdio ์๋ฒ๋ฅผ ์์ํ๋ ๋ฐ ์ฌ์ฉ๋๋ ์ ํํ ๋ช
๋ น ๋ฐ ์ธ์์ ์ผ์น
- URL ํจํด์ผ๋ก (
serverUrl): ์์ผ๋์นด๋ ์ง์์ ์ฌ์ฉํ์ฌ ์๊ฒฉ ์๋ฒ URL๊ณผ ์ผ์น
์ค์: ๊ฐ ํญ๋ชฉ์ serverName, serverCommand ๋๋ serverUrl ์ค ์ ํํ ํ๋๋ฅผ ๊ฐ์ ธ์ผ ํฉ๋๋ค.
๊ตฌ์ฑ ์
{
"allowedMcpServers": [
// ์๋ฒ ์ด๋ฆ์ผ๋ก ํ์ฉ
{ "serverName": "github" },
{ "serverName": "sentry" },
// ์ ํํ ๋ช
๋ น์ผ๋ก ํ์ฉ (stdio ์๋ฒ์ ๊ฒฝ์ฐ)
{ "serverCommand": ["npx", "-y", "@modelcontextprotocol/server-filesystem"] },
{ "serverCommand": ["python", "/usr/local/bin/approved-server.py"] },
// URL ํจํด์ผ๋ก ํ์ฉ (์๊ฒฉ ์๋ฒ์ ๊ฒฝ์ฐ)
{ "serverUrl": "https://mcp.company.com/*" },
{ "serverUrl": "https://*.internal.corp/*" }
],
"deniedMcpServers": [
// ์๋ฒ ์ด๋ฆ์ผ๋ก ์ฐจ๋จ
{ "serverName": "dangerous-server" },
// ์ ํํ ๋ช
๋ น์ผ๋ก ์ฐจ๋จ (stdio ์๋ฒ์ ๊ฒฝ์ฐ)
{ "serverCommand": ["npx", "-y", "unapproved-package"] },
// URL ํจํด์ผ๋ก ์ฐจ๋จ (์๊ฒฉ ์๋ฒ์ ๊ฒฝ์ฐ)
{ "serverUrl": "https://*.untrusted.com/*" }
]
}
๋ช
๋ น ๊ธฐ๋ฐ ์ ํ์ ์๋ ๋ฐฉ์
์ ํํ ์ผ์น:
- ๋ช
๋ น ๋ฐฐ์ด์ ์ ํํ ์ผ์นํด์ผ ํฉ๋๋ค - ๋ช
๋ น๊ณผ ์ฌ๋ฐ๋ฅธ ์์์ ๋ชจ๋ ์ธ์
- ์:
["npx", "-y", "server"]๋ ["npx", "server"] ๋๋ ["npx", "-y", "server", "--flag"]์ ์ผ์นํ์ง ์์ต๋๋ค
Stdio ์๋ฒ ๋์:
- ํ์ฉ ๋ชฉ๋ก์ ๋ชจ๋
serverCommand ํญ๋ชฉ์ด ํฌํจ๋๋ฉด stdio ์๋ฒ๋ ํด๋น ๋ช
๋ น ์ค ํ๋์ ์ผ์นํด์ผ ํฉ๋๋ค
- Stdio ์๋ฒ๋ ๋ช
๋ น ์ ํ์ด ์์ ๋ ์ด๋ฆ๋ง์ผ๋ก๋ ํต๊ณผํ ์ ์์ต๋๋ค
- ์ด๋ ๊ด๋ฆฌ์๊ฐ ์คํํ ์ ์๋ ๋ช
๋ น์ ์ ์ฉํ ์ ์๋๋ก ํฉ๋๋ค
๋น stdio ์๋ฒ ๋์:
- ์๊ฒฉ ์๋ฒ (HTTP, SSE, WebSocket)๋ ํ์ฉ ๋ชฉ๋ก์
serverUrl ํญ๋ชฉ์ด ์์ ๋ URL ๊ธฐ๋ฐ ์ผ์น๋ฅผ ์ฌ์ฉํฉ๋๋ค
- URL ํญ๋ชฉ์ด ์์ผ๋ฉด ์๊ฒฉ ์๋ฒ๋ ์ด๋ฆ ๊ธฐ๋ฐ ์ผ์น๋ก ๋์๊ฐ๋๋ค
- ๋ช
๋ น ์ ํ์ ์๊ฒฉ ์๋ฒ์ ์ ์ฉ๋์ง ์์ต๋๋ค
URL ๊ธฐ๋ฐ ์ ํ์ ์๋ ๋ฐฉ์
URL ํจํด์ *๋ฅผ ์ฌ์ฉํ์ฌ ์์ผ๋์นด๋๋ฅผ ์ง์ํ์ฌ ๋ชจ๋ ๋ฌธ์ ์ํ์ค์ ์ผ์นํฉ๋๋ค. ์ด๋ ์ ์ฒด ๋๋ฉ์ธ ๋๋ ํ์ ๋๋ฉ์ธ์ ํ์ฉํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค.
์์ผ๋์นด๋ ์:
https://mcp.company.com/* - ํน์ ๋๋ฉ์ธ์ ๋ชจ๋ ๊ฒฝ๋ก ํ์ฉ
https://*.example.com/* - example.com์ ๋ชจ๋ ํ์ ๋๋ฉ์ธ ํ์ฉ
http://localhost:*/* - localhost์ ๋ชจ๋ ํฌํธ ํ์ฉ
ํธ์คํธ๋ช
์ผ์น๋ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ง ์์ผ๋ฉฐ ํํ FQDN ์ ์ ๋ฌด์ํ์ฌ DNS ์๋ฏธ๋ก ์ ๋ฐ๋ฆ
๋๋ค. *://Mcp.Example.com/*์ ๊ฐ์ ํจํด์ https://mcp.example.com/api์ ์ผ์นํ๋ฉฐ, https://mcp.example.com.์ https://mcp.example.com๊ณผ ๋์ผํ๊ฒ ์ฒ๋ฆฌ๋ฉ๋๋ค. ์คํด๊ณผ ๊ฒฝ๋ก๋ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค.
์๊ฒฉ ์๋ฒ ๋์:
- ํ์ฉ ๋ชฉ๋ก์ ๋ชจ๋
serverUrl ํญ๋ชฉ์ด ํฌํจ๋๋ฉด ์๊ฒฉ ์๋ฒ๋ ํด๋น URL ํจํด ์ค ํ๋์ ์ผ์นํด์ผ ํฉ๋๋ค
- ์๊ฒฉ ์๋ฒ๋ URL ์ ํ์ด ์์ ๋ ์ด๋ฆ๋ง์ผ๋ก๋ ํต๊ณผํ ์ ์์ต๋๋ค
- ์ด๋ ๊ด๋ฆฌ์๊ฐ ํ์ฉ๋๋ ์๊ฒฉ ์๋ํฌ์ธํธ๋ฅผ ์ ์ฉํ ์ ์๋๋ก ํฉ๋๋ค
์: URL ์ ์ฉ ํ์ฉ ๋ชฉ๋ก
{
"allowedMcpServers": [
{ "serverUrl": "https://mcp.company.com/*" },
{ "serverUrl": "https://*.internal.corp/*" }
]
}
๊ฒฐ๊ณผ:
https://mcp.company.com/api์ HTTP ์๋ฒ: โ
ํ์ฉ๋จ (URL ํจํด๊ณผ ์ผ์น)
https://api.internal.corp/mcp์ HTTP ์๋ฒ: โ
ํ์ฉ๋จ (์์ผ๋์นด๋ ํ์ ๋๋ฉ์ธ๊ณผ ์ผ์น)
https://external.com/mcp์ HTTP ์๋ฒ: โ ์ฐจ๋จ๋จ (URL ํจํด๊ณผ ์ผ์นํ์ง ์์)
- ๋ชจ๋ ๋ช
๋ น์ Stdio ์๋ฒ: โ ์ฐจ๋จ๋จ (์ผ์นํ ์ด๋ฆ ๋๋ ๋ช
๋ น ํญ๋ชฉ ์์)
์: ๋ช
๋ น ์ ์ฉ ํ์ฉ ๋ชฉ๋ก
{
"allowedMcpServers": [
{ "serverCommand": ["npx", "-y", "approved-package"] }
]
}
๊ฒฐ๊ณผ:
["npx", "-y", "approved-package"]๋ฅผ ์ฌ์ฉํ Stdio ์๋ฒ: โ
ํ์ฉ๋จ (๋ช
๋ น๊ณผ ์ผ์น)
["node", "server.js"]๋ฅผ ์ฌ์ฉํ Stdio ์๋ฒ: โ ์ฐจ๋จ๋จ (๋ช
๋ น๊ณผ ์ผ์นํ์ง ์์)
- "my-api"๋ผ๋ ์ด๋ฆ์ HTTP ์๋ฒ: โ ์ฐจ๋จ๋จ (์ผ์นํ ์ด๋ฆ ํญ๋ชฉ ์์)
์: ํผํฉ ์ด๋ฆ ๋ฐ ๋ช
๋ น ํ์ฉ ๋ชฉ๋ก
{
"allowedMcpServers": [
{ "serverName": "github" },
{ "serverCommand": ["npx", "-y", "approved-package"] }
]
}
๊ฒฐ๊ณผ:
["npx", "-y", "approved-package"]๋ฅผ ์ฌ์ฉํ "local-tool"์ด๋ผ๋ Stdio ์๋ฒ: โ
ํ์ฉ๋จ (๋ช
๋ น๊ณผ ์ผ์น)
["node", "server.js"]๋ฅผ ์ฌ์ฉํ "local-tool"์ด๋ผ๋ Stdio ์๋ฒ: โ ์ฐจ๋จ๋จ (๋ช
๋ น ํญ๋ชฉ์ด ์์ง๋ง ์ผ์นํ์ง ์์)
["node", "server.js"]๋ฅผ ์ฌ์ฉํ "github"๋ผ๋ Stdio ์๋ฒ: โ ์ฐจ๋จ๋จ (๋ช
๋ น ํญ๋ชฉ์ด ์์ ๋ stdio ์๋ฒ๋ ๋ช
๋ น๊ณผ ์ผ์นํด์ผ ํจ)
- "github"๋ผ๋ ์ด๋ฆ์ HTTP ์๋ฒ: โ
ํ์ฉ๋จ (์ด๋ฆ๊ณผ ์ผ์น)
- "other-api"๋ผ๋ ์ด๋ฆ์ HTTP ์๋ฒ: โ ์ฐจ๋จ๋จ (์ด๋ฆ๊ณผ ์ผ์นํ์ง ์์)
์: ์ด๋ฆ ์ ์ฉ ํ์ฉ ๋ชฉ๋ก
{
"allowedMcpServers": [
{ "serverName": "github" },
{ "serverName": "internal-tool" }
]
}
๊ฒฐ๊ณผ:
- ๋ชจ๋ ๋ช
๋ น์ ์ฌ์ฉํ "github"๋ผ๋ Stdio ์๋ฒ: โ
ํ์ฉ๋จ (๋ช
๋ น ์ ํ ์์)
- ๋ชจ๋ ๋ช
๋ น์ ์ฌ์ฉํ "internal-tool"์ด๋ผ๋ Stdio ์๋ฒ: โ
ํ์ฉ๋จ (๋ช
๋ น ์ ํ ์์)
- "github"๋ผ๋ ์ด๋ฆ์ HTTP ์๋ฒ: โ
ํ์ฉ๋จ (์ด๋ฆ๊ณผ ์ผ์น)
- "other"๋ผ๋ ์ด๋ฆ์ ๋ชจ๋ ์๋ฒ: โ ์ฐจ๋จ๋จ (์ด๋ฆ๊ณผ ์ผ์นํ์ง ์์)
ํ์ฉ ๋ชฉ๋ก ๋์ (allowedMcpServers)
undefined (๊ธฐ๋ณธ๊ฐ): ์ ํ ์์ - ์ฌ์ฉ์๋ ๋ชจ๋ MCP ์๋ฒ๋ฅผ ๊ตฌ์ฑํ ์ ์์ต๋๋ค
- ๋น ๋ฐฐ์ด
[]: ์์ ํ ์ ๊ธ - ์ฌ์ฉ์๋ MCP ์๋ฒ๋ฅผ ๊ตฌ์ฑํ ์ ์์ต๋๋ค
- ํญ๋ชฉ ๋ชฉ๋ก: ์ฌ์ฉ์๋ ์ด๋ฆ, ๋ช
๋ น ๋๋ URL ํจํด๊ณผ ์ผ์นํ๋ ์๋ฒ๋ง ๊ตฌ์ฑํ ์ ์์ต๋๋ค
๊ฑฐ๋ถ ๋ชฉ๋ก ๋์ (deniedMcpServers)
undefined (๊ธฐ๋ณธ๊ฐ): ์ฐจ๋จ๋ ์๋ฒ ์์
- ๋น ๋ฐฐ์ด
[]: ์ฐจ๋จ๋ ์๋ฒ ์์
- ํญ๋ชฉ ๋ชฉ๋ก: ์ง์ ๋ ์๋ฒ๋ ๋ชจ๋ ๋ฒ์์์ ๋ช
์์ ์ผ๋ก ์ฐจ๋จ๋ฉ๋๋ค
์ค์ํ ์ฐธ๊ณ ์ฌํญ
- ์ต์
1๊ณผ ์ต์
2๋ฅผ ๊ฒฐํฉํ ์ ์์ต๋๋ค:
managed-mcp.json์ด ์กด์ฌํ๋ฉด ๋
์ ์ ์ด๋ฅผ ๊ฐ์ง๋ฉฐ ์ฌ์ฉ์๋ ์๋ฒ๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค. ํ์ฉ ๋ชฉ๋ก/๊ฑฐ๋ถ ๋ชฉ๋ก์ ์ฌ์ ํ ๊ด๋ฆฌ๋๋ ์๋ฒ ์์ฒด์ ์ ์ฉ๋ฉ๋๋ค.
- ๊ฑฐ๋ถ ๋ชฉ๋ก์ด ์ ๋ ์ฐ์ ์์๋ฅผ ๊ฐ์ต๋๋ค: ์๋ฒ๊ฐ ๊ฑฐ๋ถ ๋ชฉ๋ก ํญ๋ชฉ๊ณผ ์ผ์นํ๋ฉด (์ด๋ฆ, ๋ช
๋ น ๋๋ URL๋ก) ํ์ฉ ๋ชฉ๋ก์ ์์ด๋ ์ฐจ๋จ๋ฉ๋๋ค
- ์ด๋ฆ ๊ธฐ๋ฐ, ๋ช
๋ น ๊ธฐ๋ฐ ๋ฐ URL ๊ธฐ๋ฐ ์ ํ์ด ํจ๊ป ์๋ํฉ๋๋ค: ์๋ฒ๋ ์ด๋ฆ ํญ๋ชฉ, ๋ช
๋ น ํญ๋ชฉ ๋๋ URL ํจํด๊ณผ ์ผ์นํ๋ฉด ํต๊ณผํฉ๋๋ค (๊ฑฐ๋ถ ๋ชฉ๋ก์ผ๋ก ์ฐจ๋จ๋์ง ์๋ ํ)
263 --header "Authorization: Bearer your-token"263 --header "Authorization: Bearer your-token"
264```264```
265 265
266`.mcp.json`, `~/.claude.json` ๋๋ `claude mcp add-json`์ ํตํด JSON์ผ๋ก MCP ์๋ฒ๋ฅผ ๊ตฌ์ฑํ ๋, `type` ํ๋๋ `http`์ ๋ณ์นญ์ผ๋ก `streamable-http`๋ฅผ ํ์ฉํฉ๋๋ค. MCP ์ฌ์์ ์ด ์ ์ก์ ๋ํด `streamable-http`๋ผ๋ ์ด๋ฆ์ ์ฌ์ฉํ๋ฏ๋ก ์๋ฒ ์ค๋ช
์์์ ๋ณต์ฌํ ๊ตฌ์ฑ์ด ์์ ์์ด ์๋ํฉ๋๋ค.
267
266### ์ต์
2: ์๊ฒฉ SSE ์๋ฒ ์ถ๊ฐ268### ์ต์
2: ์๊ฒฉ SSE ์๋ฒ ์ถ๊ฐ
267 269
268<Warning>270<Warning>