์‹ฌ๋ฒŒ ๋งˆํฌ

Curify์— ๊ฐ€์ž…ํ•˜์—ฌ ๊ท€ํ•˜์˜ ๋น„๋””์˜ค๋ฅผ ์„ธ๊ณ„ํ™”ํ•˜์„ธ์š”

๋˜๋Š”

Curify๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ ์‚ฌํ•ญ์— ๋™์˜ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
์„œ๋น„์Šค ์•ฝ๊ด€ ๊ทธ๋ฆฌ๊ณ  ๊ฐœ์ธ ์ •๋ณด ๋ณดํ˜ธ ์ •์ฑ…

๐Ÿ—๏ธ QA ๋ด‡์—์„œ ์ž‘์—… ์—์ด์ „ํŠธ๊นŒ์ง€: ์•„ํ‚คํ…์ฒ˜ ๊ฐ€์ด๋“œ

TL;DR: ์งˆ๋ฌธ์—๋งŒ ๋‹ตํ•˜๋Š” ์ฑ—๋ด‡์€ ๊ทธ๋งŒ ๋งŒ๋“ค๊ณ , ์‹ค์ œ๋กœ ์ผ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—… ์—์ด์ „ํŠธ๋ฅผ ๊ตฌ์ถ•ํ•˜์„ธ์š”.

์ด ๊ฐ€์ด๋“œ์—์„œ๋Š” ๊ตฌ์ฒด์ ์ธ ์ฝ”๋“œ ์˜ˆ์ œ์™€ ์˜คํ”ˆ ์†Œ์Šค ์ฐธ์กฐ๋ฅผ ํ†ตํ•ด ์ •์  ๊ทœ์น™, ๋™์  ๊ธฐ์ˆ  ๋ฐ ๊ฒฐ์ •์  ํ›„ํฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋†€๋ฆฌ์‹ QA ๋ด‡์—์„œ ์ž‘์—… ์—์ด์ „ํŠธ๋กœ์˜ ์•„ํ‚คํ…์ฒ˜ ์ „ํ™˜์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์–‘ํ•œ ๊ตฌ์„ฑ ์š”์†Œ ๊ฐ„์˜ ์ƒํ˜ธ ์ž‘์šฉ์„ ๋ณด์—ฌ์ฃผ๋Š” ์ž‘์—… ์—์ด์ „ํŠธ ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜ ๊ทธ๋ฆผ

1. ํ•ต์‹ฌ ์ „ํ™˜: QA ๋ด‡ โ†’ ์ž‘์—… ์—์ด์ „ํŠธ

๋Œ€๋ถ€๋ถ„์˜ AI ์‹œ์Šคํ…œ์€ ์•„์ง๋„ ๋ฌธ๋งฅ์ด ๊ฐ€๋“ํ•œ QA ๋ด‡์ž…๋‹ˆ๋‹ค:

โ€ข ๊ทธ๋“ค์€ ์งˆ๋ฌธ์— ์ž˜ ๋Œ€๋‹ตํ•ฉ๋‹ˆ๋‹ค

โ€ข ์••๋ ฅ ์†์—์„œ ํ™˜๊ฐ์„ ์ผ์œผํ‚ต๋‹ˆ๋‹ค

โ€ข ์‹คํ–‰, ์•ˆ์ „ ๋ฐ ์ผ๊ด€์„ฑ์— ๋Œ€ํ•œ ๋ณด์žฅ์ด ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค

๐Ÿ’ก ์ฃผ์š” ํ†ต์ฐฐ๋ ฅ: ์ปจํ…์ŠคํŠธ๋ฅผ ํ™•์žฅํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ๊ตฌ์กฐํ™”ํ•˜์„ธ์š”.

2. 3๊ณ„์ธต ์•„ํ‚คํ…์ฒ˜

๐Ÿงฑ 1. ์ •์  ์ปจํ…์ŠคํŠธ โ€” ๊ทœ์น™ (ํ•ญ์ƒ ํ™œ์„ฑ)

  • โ€ข๋ฉ˜ํƒˆ ๋ชจ๋ธ: ์ง์› ํ•ธ๋“œ๋ถ
  • โ€ขํ•ญ์ƒ ๋กœ๋“œ๋จ
  • โ€ข์ •์ฒด์„ฑ, ์ฝ”๋”ฉ ํ‘œ์ค€, ํ–‰๋™ ์ œ์•ฝ ์กฐ๊ฑด ์ •์˜
  • โ€ขํ™˜๊ฐ ๋ฐ ์Šคํƒ€์ผ ๋“œ๋ฆฌํ”„ํŠธ ๋ฐฉ์ง€
  • โ€ข์ž‘๊ณ  ์•ˆ์ •์ ์ด๋ฉฐ ์‚ฌ๋žŒ์ด ํŽธ์ง‘ ๊ฐ€๋Šฅ

๐Ÿ› ๏ธ 2. ๋™์  ์ปจํ…์ŠคํŠธ โ€” ๊ธฐ์ˆ  (์š”์ฒญ ์‹œ)

  • โ€ข๋ฉ˜ํƒˆ ๋ชจ๋ธ: ํˆด๋ฐ•์Šค
  • โ€ขํ•„์š”ํ•  ๋•Œ๋งŒ ๋กœ๋“œ๋จ
  • โ€ข๊ฐ ๊ธฐ์ˆ ์€ ๋…๋ฆฝ์ ์ธ ๊ธฐ๋Šฅ
  • โ€ข์ปจํ…์ŠคํŠธ ์ฐฝ์„ ๊นจ๋—ํ•˜๊ฒŒ ์œ ์ง€

โš“ 3. ๊ฒฐ์ •์  ํ›„ํฌ โ€” ๊ฐ€๋“œ๋ ˆ์ผ

  • โ€ข๋ฉ˜ํƒˆ ๋ชจ๋ธ: ๋ณด์•ˆ + ๊ทœ์ • ์ค€์ˆ˜ ๋ ˆ์ด์–ด
  • โ€ขํ™•๋ฅ ์ ์ด์ง€ ์•Š์Œ
  • โ€ขLLM ์ถ”๋ก  ์ „ํ›„์— ์‹คํ–‰
  • โ€ข์ ˆ๋Œ€ ์‹คํŒจํ•ด์„œ๋Š” ์•ˆ ๋˜๋Š” ๊ทœ์น™ ๊ฐ•์ œ

3. ๊ถŒ์žฅ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

๋‚ด ์ž‘์—… ์—์ด์ „ํŠธ/
โ”œโ”€โ”€.cursorrules
โ”œโ”€โ”€ main.py
โ”œโ”€โ”€ ๋„๊ตฌ/
โ”‚ โ””โ”€โ”€ linear_mcp.py
โ””โ”€โ”€ README.md

4. ์ •์  ์ปจํ…์ŠคํŠธ ์˜ˆ:.cursorrules

# ์—ญํ• 
๊ท€ํ•˜๋Š” ์ƒ์‚ฐ ๋“ฑ๊ธ‰ ์‹œ์Šคํ…œ์— ์ฃผ๋ ฅํ•˜๋Š” ์ˆ˜์„ Python ์—”์ง€๋‹ˆ์–ด์ž…๋‹ˆ๋‹ค.

# ๊ทœ์น™
- ๋””๋ฒ„๊น…์„ ์œ„ํ•ด ์ ˆ๋Œ€๋กœ print()๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์„ธ์š”.
- ํ•ญ์ƒ ์œ ํ˜• ํžŒํŠธ ๊ธฐ๋Šฅ
- 3๊ฐœ ์ด์ƒ์˜ ํŒŒ์ผ์„ ํ„ฐ์น˜ํ•˜๋Š” ๊ฒฝ์šฐ ๊ณ„ํš ์ œ์•ˆ

# ํ–‰๋™
- ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ž‘์„ฑํ•˜์„ธ์š”
- ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋ช…ํ™•ํ•œ ์งˆ๋ฌธ์„ ํ•˜์„ธ์š”.

์ฐธ์กฐ: https://github.com/PatrickJS/awesome-cursorrules

5. ๋‹ค์ด๋‚˜๋ฏน ์Šคํ‚ฌ ์˜ˆ์‹œ(MCP)

mcp.server.fastmcp์—์„œ FastMCP ๊ฐ€์ ธ์˜ค๊ธฐ

mcp = FastMCP("DevTools")

@mcp.tool()
def create_linear_ticket(title: str, ์šฐ์„ ์ˆœ์œ„: str = "low") -> str:
    ticket_id = f"LIN-{hash(title) % 10000}"
    f"์šฐ์„ ์ˆœ์œ„๊ฐ€ {priority}์ธ ์ƒ์„ฑ๋œ ํ‹ฐ์ผ“ {ticket_id}"์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

__name__ == "__main__"์ธ ๊ฒฝ์šฐ:
    mcp.run()

์ฐธ์กฐ: https://github.com/modelcontextprotocol/python-sdk

6. ๊ฒฐ์ •์  ํ›„ํฌ ์˜ˆ

def compliance_check_hook(state):
    user_input = state["messages"][-1].content.lower()
    if "password" in user_input or "api_key" in user_input:
        return {"error": "๋ณด์•ˆ ์œ„๋ฐ˜์ด ๊ฐ์ง€๋˜์—ˆ์Šต๋‹ˆ๋‹ค"}
    return agent_node(state)

์ฐธ๊ณ : https://langchain-ai.github.io/langgraph/

์ƒ๋‹ด์›์ด ์งˆ๋ฌธ์—๋งŒ ๋‹ต๋ณ€ํ•œ๋‹ค๋ฉด ๊ทธ๊ฒƒ์€ ์ฑ—๋ด‡์ž…๋‹ˆ๋‹ค. ์•ˆ์ •์ ์œผ๋กœ ์ž‘์—…์„ ์‹คํ–‰ํ•œ๋‹ค๋ฉด ํƒœ์Šคํฌ ์—์ด์ „ํŠธ์ž…๋‹ˆ๋‹ค.

๊ด€๋ จ ๊ธฐ์‚ฌ

DS & AI Engineering