codeguard-taikt


Namecodeguard-taikt JSON
Version 0.1.1 PyPI version JSON
download
home_pageNone
SummaryA simple MCP server taikt
upload_time2025-07-18 10:27:01
maintainerNone
docs_urlNone
authorTran Anh Tai
requires_python>=3.10
licenseMIT
keywords automation fetch llm mcp web
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # MCP server

A simple MCP server by taikt

## Usage

## Todo
execute server tu dong tu vscode extension
https://code.visualstudio.com/api/extension-guides/mcp

# install clang
wget https://apt.llvm.org/llvm.sh
chmod +x llvm.sh 
sudo ./llvm.sh 20
sudo apt-get install libclang-20-dev clang-20
ls /usr/lib/llvm-20/lib/libclang.so

source venv/bin/activate
pip install clang (pip uninstall clang)

# work flow
Có! Để biết biến nào bị truy cập bởi nhiều thread, bạn cần:

1. **Phân tích call graph**: Xác định các hàm được gọi trong từng thread entry function.
2. **Ghi nhận truy cập biến**: Với mỗi hàm, phân tích các truy cập tới biến thành viên (member variable) hoặc biến toàn cục.
3. **Gắn thread context**: Đánh dấu mỗi truy cập biến là thuộc context nào (main hoặc thread).
4. **Gom nhóm theo biến**: Sau khi phân tích, gom nhóm các truy cập theo biến. Nếu một biến bị truy cập ở cả context main và thread (hoặc nhiều thread), đó là biến nghi ngờ bị race condition.

Pipeline hiện tại đã có logic này, nhưng cần đảm bảo:
- Metadata truy cập biến phải ghi rõ tên biến, class, file, và thread_context.
- Phân tích text hoặc AST phải đủ chính xác để không bỏ sót truy cập.

Tóm lại: Cần metadata chi tiết về mọi truy cập biến, gắn thread_context, rồi kiểm tra biến nào xuất hiện ở nhiều thread. Đây là cách chuẩn để phát hiện biến nghi ngờ bị race condition.

# how pro-tool doing
Các công cụ phân tích tĩnh chuyên nghiệp (như Coverity, Clang Static Analyzer, CodeSonar, Infer, ThreadSanitizer) thường giải quyết bước 2 bằng các kỹ thuật sau:

1. **Phân tích AST nâng cao**: Sử dụng AST chi tiết để nhận diện mọi truy cập biến, kể cả các phép toán như `value++`, `this->value++`, `value = ...`, kể cả qua con trỏ hoặc tham chiếu.

2. **Phân tích IR/SSA**: Chuyển mã nguồn sang Intermediate Representation (IR) hoặc Static Single Assignment (SSA) để dễ dàng theo dõi mọi truy cập và thay đổi biến trong toàn bộ chương trình.

3. **Dataflow Analysis**: Theo dõi luồng dữ liệu (dataflow) để xác định biến nào bị truy cập ở đâu, bởi hàm nào, trong context nào (thread/main).

4. **Symbolic Execution**: Mô phỏng luồng thực thi của chương trình để phát hiện mọi trường hợp truy cập biến, kể cả các nhánh điều kiện phức tạp.

5. **Thread/Concurrency Modeling**: Xây dựng mô hình các luồng (thread) và các điểm đồng bộ hóa (mutex, atomic, lock) để xác định biến nào bị truy cập đồng thời mà không có bảo vệ.

6. **Kết hợp phân tích text và AST**: Nếu AST không đủ, sẽ kết hợp với phân tích text, nhưng luôn ưu tiên AST/IR để đảm bảo độ chính xác.

Tóm lại: Công cụ chuyên nghiệp dùng AST/IR/dataflow/symbolic execution để ghi nhận mọi truy cập biến, không chỉ dựa vào regex text. Điều này giúp phát hiện đầy đủ và chính xác các biến bị truy cập bởi nhiều thread.

Giải pháp tổng quát để phân tích multi-thread functions và call graph trong nhiều dự án C++ với cấu trúc khác nhau:

### 1. **Tách biệt code user và code hệ thống**
- Chỉ thu thập các node thuộc file user (so sánh path với danh sách file dự án).
- Không duyệt node thuộc system headers để tránh log rác và tăng tốc.

### 2. **Thu thập hàm user định nghĩa**
- Duyệt đệ quy AST, thu thập tất cả các `FUNCTION_DECL` thuộc file user.
- Đối với hàm thành viên class, tạo key dạng `ClassName::FunctionName`.
- Đối với hàm global, dùng tên hàm.

### 3. **Xác định entrypoint và trace call graph**
- Xác định các hàm được dùng làm entrypoint cho thread (hàm truyền vào `std::thread`, `pthread_create`, v.v.).
- Trace call graph từ các entrypoint, ghi nhận tất cả hàm được gọi trực tiếp/gián tiếp trong ngữ cảnh thread.

### 4. **Xử lý các trường hợp đặc biệt**
- **Lambda:** AST không nhận diện lambda là hàm user định nghĩa, nên không trace được call graph. Giải pháp: Nếu dự án dùng lambda cho thread, cần có logic nhận diện và phân tích lambda (phức tạp, nhiều giới hạn).
- **Template, Inline, Macro:** Một số hàm template, inline, macro có thể bị Clang bỏ qua nếu không parse đúng context. Giải pháp: Cần biên dịch với compile flags đầy đủ, hoặc parse theo project thực tế (dùng compile_commands.json).
- **Dự án lớn, nhiều file:** Nên parse theo từng file hoặc theo project, không parse toàn bộ workspace một lần.

### 5. **Limitation của phương pháp hiện tại**
- **Clang AST chỉ nhận diện hàm khi parse đúng context:** Nếu không biên dịch như project thực tế, nhiều hàm sẽ bị bỏ qua.
- **Không trace được lambda, macro, template phức tạp.**
- **Không nhận diện các hàm được gọi qua function pointer, std::function, hoặc callback phức tạp.**
- **Không phân biệt được các hàm overload, hàm cùng tên ở nhiều class nếu không có đủ thông tin context.**

### 6. **Giải pháp nâng cao**
- Sử dụng compile_commands.json để parse đúng context từng file như khi biên dịch thực tế.
- Kết hợp với các công cụ phân tích tĩnh khác (CodeQL, Cppcheck, Clang Static Analyzer) để bổ sung thông tin.
- Nếu cần trace lambda, macro, template, phải viết thêm logic nhận diện AST node đặc biệt hoặc dùng các tool chuyên biệt.

---

**Tóm lại:**  
Phương pháp hiện tại phù hợp với các dự án C++ có cấu trúc rõ ràng, hàm thread entrypoint là hàm user định nghĩa, không dùng lambda/macro phức tạp. Nếu dự án dùng nhiều lambda, macro, template, hoặc có cấu trúc lớn, cần bổ sung logic nhận diện đặc biệt hoặc dùng compile_commands.json để parse đúng context.


Đúng, với dự án C++ phức tạp sử dụng lambda, macro, template, function pointer, hoặc callback, phương pháp phân tích dựa trên Clang AST và thu thập hàm entrypoint như hiện tại sẽ không đủ chính xác.

### Các phương pháp giải quyết trường hợp phức tạp:

#### 1. **Sử dụng compile_commands.json và Clang Tooling**
- Parse code theo đúng context biên dịch thực tế (đầy đủ flags, macro, include path).
- Dùng Clang Tooling (libTooling, clang-query, clang-tidy) để phân tích sâu hơn, có thể nhận diện lambda, template, macro, function pointer.

#### 2. **Kết hợp với CodeQL hoặc các công cụ phân tích tĩnh nâng cao**
- CodeQL có thể truy vết call graph, data flow, và nhận diện các hàm được gọi qua lambda, macro, template, function pointer.
- Có thể viết truy vấn để tìm các điểm truy cập biến trong nhiều luồng, kể cả qua callback/lambda.

#### 3. **Sử dụng Clang Static Analyzer hoặc Cppcheck**
- Các tool này có thể phân tích data flow, control flow, và nhận diện các vấn đề concurrency, kể cả khi dùng lambda, macro, template.

#### 4. **Kết hợp nhiều phương pháp**
- Dùng Clang AST để thu thập hàm cơ bản.
- Dùng CodeQL hoặc Cppcheck để phân tích sâu các trường hợp đặc biệt.
- Dùng compile_commands.json để parse đúng context từng file.

#### 5. **Phân tích runtime (dynamic analysis)**
- Dùng các tool như ThreadSanitizer, Helgrind, hoặc các framework kiểm tra concurrency khi chạy thực tế để phát hiện race condition mà static analysis không nhận diện được.

---

**Tóm lại:**  
- Để phân tích chính xác các dự án phức tạp, nên kết hợp Clang Tooling (với compile_commands.json), CodeQL, Cppcheck, và các tool runtime như ThreadSanitizer.
- Không có một phương pháp duy nhất nào giải quyết hoàn toàn mọi trường hợp phức tạp của C++.
- Nên dùng nhiều lớp phân tích (static + dynamic) và parse code theo đúng context biên dịch thực tế.

Nếu bạn muốn hướng dẫn cụ thể về CodeQL, compile_commands.json, hoặc các tool runtime, hãy yêu cầu chi tiết!

Clang Static Analyzer **không trực tiếp xuất ra danh sách các hàm chạy trong ngữ cảnh multi-thread**. Công cụ này chủ yếu phát hiện các lỗi như race condition, deadlock, memory leak, nhưng không liệt kê call graph hoặc các hàm được thực thi bởi nhiều thread.

**Giải thích chi tiết:**
- Clang Static Analyzer sẽ báo lỗi khi phát hiện truy cập biến không đồng bộ giữa các thread, nhưng không xuất ra danh sách hàm nào bị ảnh hưởng hoặc hàm nào là entrypoint của thread.
- Nếu bạn muốn lấy danh sách các hàm chạy trong ngữ cảnh multi-thread, bạn cần dùng Clang AST, CodeQL, hoặc các tool phân tích call graph chuyên biệt (hoặc tự viết script phân tích AST).

**Tóm lại:**  
- Clang Static Analyzer giúp phát hiện lỗi concurrency, nhưng không xuất ra danh sách hàm multi-thread.
- Nếu cần danh sách hàm, hãy dùng Clang AST, CodeQL, hoặc các tool call graph khác.

Nếu bạn muốn hướng dẫn dùng CodeQL hoặc Clang AST để lấy danh sách hàm multi-thread, tôi có thể hỗ trợ chi tiết!

Đúng, Clang AST như cách bạn đang implement **không xử lý triệt để cho code phức tạp dùng lambda, macro, template, function pointer, hoặc callback**.

**Lý do:**
- Lambda trong C++ được Clang AST nhận diện là một kiểu node đặc biệt (LambdaExpr), không phải FUNCTION_DECL, nên không dễ truy vết như hàm thường.
- Nếu thread entrypoint là lambda, bạn sẽ không có tên hàm cụ thể để trace call graph, và không thể xác định rõ các hàm bị ảnh hưởng trong multi-thread context.
- Macro, template, function pointer, callback cũng khó trace vì Clang AST chỉ phân tích cú pháp, không phân tích luồng thực thi động hoặc các trường hợp phức tạp.

**Kết luận:**  
- Clang AST chỉ phù hợp cho code C++ có cấu trúc rõ ràng, hàm entrypoint là hàm user định nghĩa.
- Với code phức tạp dùng lambda, macro, template, function pointer, bạn cần kết hợp thêm các tool khác (CodeQL, static analyzer nâng cao, hoặc dynamic analysis).

Nếu bạn muốn phân tích sâu lambda, cần viết logic nhận diện LambdaExpr và phân tích body của lambda, nhưng vẫn có nhiều giới hạn và không thể trace call graph như hàm thường.

# callstack
Có hai cách để phân tích call stack:

1. **Phân tích tĩnh (static analysis)**  
   - Dùng AST để xây dựng call graph: xác định hàm nào gọi hàm nào, từ đó biết luồng thực thi tiềm năng.
   - Không cần chạy chương trình, nhưng không thể biết chính xác call stack thực tế nếu có các nhánh động, virtual, function pointer, v.v.

2. **Phân tích động (dynamic analysis)**  
   - Build và chạy chương trình, dùng các công cụ như gdb, lldb, Valgrind, ThreadSanitizer, hoặc thêm mã log để ghi lại call stack khi chương trình thực thi.
   - Có thể dùng macro hoặc hook để in call stack tại các điểm truy cập biến nghi ngờ.
   - Kết quả phản ánh đúng call stack thực tế, nhưng chỉ cho các trường hợp đã chạy qua.

Nếu muốn lấy call stack thực tế:
- Build chương trình với debug symbols (`-g`).
- Chạy với gdb/lldb, đặt breakpoint tại hàm hoặc biến nghi ngờ, dùng lệnh `bt` (backtrace) để lấy call stack.
- Hoặc dùng ThreadSanitizer (`-fsanitize=thread`) để tự động phát hiện race và in call stack khi phát hiện lỗi.

Tóm lại:  
- Phân tích tĩnh chỉ cho call graph tiềm năng.  
- Phân tích động (build và chạy) mới lấy được call stack thực tế tại thời điểm truy cập biến.  
Bạn muốn hướng dẫn chi tiết cách lấy call stack bằng gdb/lldb hoặc ThreadSanitizer không?


## Example

cd /home/worker/src/codefun/deepl/mcp_server
### tao moi truong ao 1 lan dau
rm -rf venv
sudo apt install python3.12-venv
python3 -m venv venv 

### kich hoat moi truong ao neu mo new terminal
source venv/bin/activate 

### luon cai lai khi thay doi server code
pip install -e .

## run server
start server trong mcp.json
mo copilot chat cua so moi (copilot tu dong ket noi server)
go: fetch_lgedv_rule

## xem log
cat /tmp/mcp_simple_prompt.log

## upload package
Truy cập https://pypi.org/account/register/
Đăng ký tài khoản và xác thực email.

(xoa existing venv)
rm -rf venv

sudo apt install python3.12-venv
source venv/bin/activate
pip install build twine
(trong thu muc chua pyproject.toml)
pip install build
python -m build

Kết quả: thư mục dist/ sẽ có file .whl và .tar.gz

upload len PyPI
twine upload dist/*

## user install
python3 -m venv venv
source venv/bin/activate
pip install codeguard-taikt

## user setup mcp.json
"servers": {
  "codeguard": {
    "command": "/duong_dan_toi_venv/bin/codeguard",
    "args": ["--transport", "stdio"]
  }
}

## When use MCP resource
dung khi co file markdown, vi cau truc don gian, tham khao cach lay lgedv rule(markdown) bang mcp resource trong code hien tai 
Neu lay resouce la cpp file, no khong co cau truc nen AI agent kho hieu, khong the parse
metadata type.

## note
Có, rất cần thiết phải có file __init__.py trong thư mục package (ví dụ: mcp_server/) nếu bạn muốn Python nhận diện đó là một package hợp lệ để import (ví dụ: import mcp_server.server). File này có thể rỗng, chỉ cần tồn tại.

File __main__.py không bắt buộc, trừ khi bạn muốn chạy package đó như một module (python -m mcp_server). Đối với trường hợp sử dụng entry point script như mcp-taikt = "mcp_server.server:main", bạn không cần __main__.py, chỉ cần __init__.py là đủ.

Tóm lại:
- __init__.py: Bắt buộc để Python nhận diện package.
- __main__.py: Chỉ cần nếu muốn chạy python -m <package>. Không bắt buộc cho entry point script.


            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "codeguard-taikt",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.10",
    "maintainer_email": null,
    "keywords": "automation, fetch, llm, mcp, web",
    "author": "Tran Anh Tai",
    "author_email": null,
    "download_url": "https://files.pythonhosted.org/packages/87/7a/2b2a9b1cd140a47f3931e8c462dda54d13ada8b2fb72befb04dd64d88ba5/codeguard_taikt-0.1.1.tar.gz",
    "platform": null,
    "description": "# MCP server\n\nA simple MCP server by taikt\n\n## Usage\n\n## Todo\nexecute server tu dong tu vscode extension\nhttps://code.visualstudio.com/api/extension-guides/mcp\n\n# install clang\nwget https://apt.llvm.org/llvm.sh\nchmod +x llvm.sh \nsudo ./llvm.sh 20\nsudo apt-get install libclang-20-dev clang-20\nls /usr/lib/llvm-20/lib/libclang.so\n\nsource venv/bin/activate\npip install clang (pip uninstall clang)\n\n# work flow\nC\u00f3! \u0110\u1ec3 bi\u1ebft bi\u1ebfn n\u00e0o b\u1ecb truy c\u1eadp b\u1edfi nhi\u1ec1u thread, b\u1ea1n c\u1ea7n:\n\n1. **Ph\u00e2n t\u00edch call graph**: X\u00e1c \u0111\u1ecbnh c\u00e1c h\u00e0m \u0111\u01b0\u1ee3c g\u1ecdi trong t\u1eebng thread entry function.\n2. **Ghi nh\u1eadn truy c\u1eadp bi\u1ebfn**: V\u1edbi m\u1ed7i h\u00e0m, ph\u00e2n t\u00edch c\u00e1c truy c\u1eadp t\u1edbi bi\u1ebfn th\u00e0nh vi\u00ean (member variable) ho\u1eb7c bi\u1ebfn to\u00e0n c\u1ee5c.\n3. **G\u1eafn thread context**: \u0110\u00e1nh d\u1ea5u m\u1ed7i truy c\u1eadp bi\u1ebfn l\u00e0 thu\u1ed9c context n\u00e0o (main ho\u1eb7c thread).\n4. **Gom nh\u00f3m theo bi\u1ebfn**: Sau khi ph\u00e2n t\u00edch, gom nh\u00f3m c\u00e1c truy c\u1eadp theo bi\u1ebfn. N\u1ebfu m\u1ed9t bi\u1ebfn b\u1ecb truy c\u1eadp \u1edf c\u1ea3 context main v\u00e0 thread (ho\u1eb7c nhi\u1ec1u thread), \u0111\u00f3 l\u00e0 bi\u1ebfn nghi ng\u1edd b\u1ecb race condition.\n\nPipeline hi\u1ec7n t\u1ea1i \u0111\u00e3 c\u00f3 logic n\u00e0y, nh\u01b0ng c\u1ea7n \u0111\u1ea3m b\u1ea3o:\n- Metadata truy c\u1eadp bi\u1ebfn ph\u1ea3i ghi r\u00f5 t\u00ean bi\u1ebfn, class, file, v\u00e0 thread_context.\n- Ph\u00e2n t\u00edch text ho\u1eb7c AST ph\u1ea3i \u0111\u1ee7 ch\u00ednh x\u00e1c \u0111\u1ec3 kh\u00f4ng b\u1ecf s\u00f3t truy c\u1eadp.\n\nT\u00f3m l\u1ea1i: C\u1ea7n metadata chi ti\u1ebft v\u1ec1 m\u1ecdi truy c\u1eadp bi\u1ebfn, g\u1eafn thread_context, r\u1ed3i ki\u1ec3m tra bi\u1ebfn n\u00e0o xu\u1ea5t hi\u1ec7n \u1edf nhi\u1ec1u thread. \u0110\u00e2y l\u00e0 c\u00e1ch chu\u1ea9n \u0111\u1ec3 ph\u00e1t hi\u1ec7n bi\u1ebfn nghi ng\u1edd b\u1ecb race condition.\n\n# how pro-tool doing\nC\u00e1c c\u00f4ng c\u1ee5 ph\u00e2n t\u00edch t\u0129nh chuy\u00ean nghi\u1ec7p (nh\u01b0 Coverity, Clang Static Analyzer, CodeSonar, Infer, ThreadSanitizer) th\u01b0\u1eddng gi\u1ea3i quy\u1ebft b\u01b0\u1edbc 2 b\u1eb1ng c\u00e1c k\u1ef9 thu\u1eadt sau:\n\n1. **Ph\u00e2n t\u00edch AST n\u00e2ng cao**: S\u1eed d\u1ee5ng AST chi ti\u1ebft \u0111\u1ec3 nh\u1eadn di\u1ec7n m\u1ecdi truy c\u1eadp bi\u1ebfn, k\u1ec3 c\u1ea3 c\u00e1c ph\u00e9p to\u00e1n nh\u01b0 `value++`, `this->value++`, `value = ...`, k\u1ec3 c\u1ea3 qua con tr\u1ecf ho\u1eb7c tham chi\u1ebfu.\n\n2. **Ph\u00e2n t\u00edch IR/SSA**: Chuy\u1ec3n m\u00e3 ngu\u1ed3n sang Intermediate Representation (IR) ho\u1eb7c Static Single Assignment (SSA) \u0111\u1ec3 d\u1ec5 d\u00e0ng theo d\u00f5i m\u1ecdi truy c\u1eadp v\u00e0 thay \u0111\u1ed5i bi\u1ebfn trong to\u00e0n b\u1ed9 ch\u01b0\u01a1ng tr\u00ecnh.\n\n3. **Dataflow Analysis**: Theo d\u00f5i lu\u1ed3ng d\u1eef li\u1ec7u (dataflow) \u0111\u1ec3 x\u00e1c \u0111\u1ecbnh bi\u1ebfn n\u00e0o b\u1ecb truy c\u1eadp \u1edf \u0111\u00e2u, b\u1edfi h\u00e0m n\u00e0o, trong context n\u00e0o (thread/main).\n\n4. **Symbolic Execution**: M\u00f4 ph\u1ecfng lu\u1ed3ng th\u1ef1c thi c\u1ee7a ch\u01b0\u01a1ng tr\u00ecnh \u0111\u1ec3 ph\u00e1t hi\u1ec7n m\u1ecdi tr\u01b0\u1eddng h\u1ee3p truy c\u1eadp bi\u1ebfn, k\u1ec3 c\u1ea3 c\u00e1c nh\u00e1nh \u0111i\u1ec1u ki\u1ec7n ph\u1ee9c t\u1ea1p.\n\n5. **Thread/Concurrency Modeling**: X\u00e2y d\u1ef1ng m\u00f4 h\u00ecnh c\u00e1c lu\u1ed3ng (thread) v\u00e0 c\u00e1c \u0111i\u1ec3m \u0111\u1ed3ng b\u1ed9 h\u00f3a (mutex, atomic, lock) \u0111\u1ec3 x\u00e1c \u0111\u1ecbnh bi\u1ebfn n\u00e0o b\u1ecb truy c\u1eadp \u0111\u1ed3ng th\u1eddi m\u00e0 kh\u00f4ng c\u00f3 b\u1ea3o v\u1ec7.\n\n6. **K\u1ebft h\u1ee3p ph\u00e2n t\u00edch text v\u00e0 AST**: N\u1ebfu AST kh\u00f4ng \u0111\u1ee7, s\u1ebd k\u1ebft h\u1ee3p v\u1edbi ph\u00e2n t\u00edch text, nh\u01b0ng lu\u00f4n \u01b0u ti\u00ean AST/IR \u0111\u1ec3 \u0111\u1ea3m b\u1ea3o \u0111\u1ed9 ch\u00ednh x\u00e1c.\n\nT\u00f3m l\u1ea1i: C\u00f4ng c\u1ee5 chuy\u00ean nghi\u1ec7p d\u00f9ng AST/IR/dataflow/symbolic execution \u0111\u1ec3 ghi nh\u1eadn m\u1ecdi truy c\u1eadp bi\u1ebfn, kh\u00f4ng ch\u1ec9 d\u1ef1a v\u00e0o regex text. \u0110i\u1ec1u n\u00e0y gi\u00fap ph\u00e1t hi\u1ec7n \u0111\u1ea7y \u0111\u1ee7 v\u00e0 ch\u00ednh x\u00e1c c\u00e1c bi\u1ebfn b\u1ecb truy c\u1eadp b\u1edfi nhi\u1ec1u thread.\n\nGi\u1ea3i ph\u00e1p t\u1ed5ng qu\u00e1t \u0111\u1ec3 ph\u00e2n t\u00edch multi-thread functions v\u00e0 call graph trong nhi\u1ec1u d\u1ef1 \u00e1n C++ v\u1edbi c\u1ea5u tr\u00fac kh\u00e1c nhau:\n\n### 1. **T\u00e1ch bi\u1ec7t code user v\u00e0 code h\u1ec7 th\u1ed1ng**\n- Ch\u1ec9 thu th\u1eadp c\u00e1c node thu\u1ed9c file user (so s\u00e1nh path v\u1edbi danh s\u00e1ch file d\u1ef1 \u00e1n).\n- Kh\u00f4ng duy\u1ec7t node thu\u1ed9c system headers \u0111\u1ec3 tr\u00e1nh log r\u00e1c v\u00e0 t\u0103ng t\u1ed1c.\n\n### 2. **Thu th\u1eadp h\u00e0m user \u0111\u1ecbnh ngh\u0129a**\n- Duy\u1ec7t \u0111\u1ec7 quy AST, thu th\u1eadp t\u1ea5t c\u1ea3 c\u00e1c `FUNCTION_DECL` thu\u1ed9c file user.\n- \u0110\u1ed1i v\u1edbi h\u00e0m th\u00e0nh vi\u00ean class, t\u1ea1o key d\u1ea1ng `ClassName::FunctionName`.\n- \u0110\u1ed1i v\u1edbi h\u00e0m global, d\u00f9ng t\u00ean h\u00e0m.\n\n### 3. **X\u00e1c \u0111\u1ecbnh entrypoint v\u00e0 trace call graph**\n- X\u00e1c \u0111\u1ecbnh c\u00e1c h\u00e0m \u0111\u01b0\u1ee3c d\u00f9ng l\u00e0m entrypoint cho thread (h\u00e0m truy\u1ec1n v\u00e0o `std::thread`, `pthread_create`, v.v.).\n- Trace call graph t\u1eeb c\u00e1c entrypoint, ghi nh\u1eadn t\u1ea5t c\u1ea3 h\u00e0m \u0111\u01b0\u1ee3c g\u1ecdi tr\u1ef1c ti\u1ebfp/gi\u00e1n ti\u1ebfp trong ng\u1eef c\u1ea3nh thread.\n\n### 4. **X\u1eed l\u00fd c\u00e1c tr\u01b0\u1eddng h\u1ee3p \u0111\u1eb7c bi\u1ec7t**\n- **Lambda:** AST kh\u00f4ng nh\u1eadn di\u1ec7n lambda l\u00e0 h\u00e0m user \u0111\u1ecbnh ngh\u0129a, n\u00ean kh\u00f4ng trace \u0111\u01b0\u1ee3c call graph. Gi\u1ea3i ph\u00e1p: N\u1ebfu d\u1ef1 \u00e1n d\u00f9ng lambda cho thread, c\u1ea7n c\u00f3 logic nh\u1eadn di\u1ec7n v\u00e0 ph\u00e2n t\u00edch lambda (ph\u1ee9c t\u1ea1p, nhi\u1ec1u gi\u1edbi h\u1ea1n).\n- **Template, Inline, Macro:** M\u1ed9t s\u1ed1 h\u00e0m template, inline, macro c\u00f3 th\u1ec3 b\u1ecb Clang b\u1ecf qua n\u1ebfu kh\u00f4ng parse \u0111\u00fang context. Gi\u1ea3i ph\u00e1p: C\u1ea7n bi\u00ean d\u1ecbch v\u1edbi compile flags \u0111\u1ea7y \u0111\u1ee7, ho\u1eb7c parse theo project th\u1ef1c t\u1ebf (d\u00f9ng compile_commands.json).\n- **D\u1ef1 \u00e1n l\u1edbn, nhi\u1ec1u file:** N\u00ean parse theo t\u1eebng file ho\u1eb7c theo project, kh\u00f4ng parse to\u00e0n b\u1ed9 workspace m\u1ed9t l\u1ea7n.\n\n### 5. **Limitation c\u1ee7a ph\u01b0\u01a1ng ph\u00e1p hi\u1ec7n t\u1ea1i**\n- **Clang AST ch\u1ec9 nh\u1eadn di\u1ec7n h\u00e0m khi parse \u0111\u00fang context:** N\u1ebfu kh\u00f4ng bi\u00ean d\u1ecbch nh\u01b0 project th\u1ef1c t\u1ebf, nhi\u1ec1u h\u00e0m s\u1ebd b\u1ecb b\u1ecf qua.\n- **Kh\u00f4ng trace \u0111\u01b0\u1ee3c lambda, macro, template ph\u1ee9c t\u1ea1p.**\n- **Kh\u00f4ng nh\u1eadn di\u1ec7n c\u00e1c h\u00e0m \u0111\u01b0\u1ee3c g\u1ecdi qua function pointer, std::function, ho\u1eb7c callback ph\u1ee9c t\u1ea1p.**\n- **Kh\u00f4ng ph\u00e2n bi\u1ec7t \u0111\u01b0\u1ee3c c\u00e1c h\u00e0m overload, h\u00e0m c\u00f9ng t\u00ean \u1edf nhi\u1ec1u class n\u1ebfu kh\u00f4ng c\u00f3 \u0111\u1ee7 th\u00f4ng tin context.**\n\n### 6. **Gi\u1ea3i ph\u00e1p n\u00e2ng cao**\n- S\u1eed d\u1ee5ng compile_commands.json \u0111\u1ec3 parse \u0111\u00fang context t\u1eebng file nh\u01b0 khi bi\u00ean d\u1ecbch th\u1ef1c t\u1ebf.\n- K\u1ebft h\u1ee3p v\u1edbi c\u00e1c c\u00f4ng c\u1ee5 ph\u00e2n t\u00edch t\u0129nh kh\u00e1c (CodeQL, Cppcheck, Clang Static Analyzer) \u0111\u1ec3 b\u1ed5 sung th\u00f4ng tin.\n- N\u1ebfu c\u1ea7n trace lambda, macro, template, ph\u1ea3i vi\u1ebft th\u00eam logic nh\u1eadn di\u1ec7n AST node \u0111\u1eb7c bi\u1ec7t ho\u1eb7c d\u00f9ng c\u00e1c tool chuy\u00ean bi\u1ec7t.\n\n---\n\n**T\u00f3m l\u1ea1i:**  \nPh\u01b0\u01a1ng ph\u00e1p hi\u1ec7n t\u1ea1i ph\u00f9 h\u1ee3p v\u1edbi c\u00e1c d\u1ef1 \u00e1n C++ c\u00f3 c\u1ea5u tr\u00fac r\u00f5 r\u00e0ng, h\u00e0m thread entrypoint l\u00e0 h\u00e0m user \u0111\u1ecbnh ngh\u0129a, kh\u00f4ng d\u00f9ng lambda/macro ph\u1ee9c t\u1ea1p. N\u1ebfu d\u1ef1 \u00e1n d\u00f9ng nhi\u1ec1u lambda, macro, template, ho\u1eb7c c\u00f3 c\u1ea5u tr\u00fac l\u1edbn, c\u1ea7n b\u1ed5 sung logic nh\u1eadn di\u1ec7n \u0111\u1eb7c bi\u1ec7t ho\u1eb7c d\u00f9ng compile_commands.json \u0111\u1ec3 parse \u0111\u00fang context.\n\n\n\u0110\u00fang, v\u1edbi d\u1ef1 \u00e1n C++ ph\u1ee9c t\u1ea1p s\u1eed d\u1ee5ng lambda, macro, template, function pointer, ho\u1eb7c callback, ph\u01b0\u01a1ng ph\u00e1p ph\u00e2n t\u00edch d\u1ef1a tr\u00ean Clang AST v\u00e0 thu th\u1eadp h\u00e0m entrypoint nh\u01b0 hi\u1ec7n t\u1ea1i s\u1ebd kh\u00f4ng \u0111\u1ee7 ch\u00ednh x\u00e1c.\n\n### C\u00e1c ph\u01b0\u01a1ng ph\u00e1p gi\u1ea3i quy\u1ebft tr\u01b0\u1eddng h\u1ee3p ph\u1ee9c t\u1ea1p:\n\n#### 1. **S\u1eed d\u1ee5ng compile_commands.json v\u00e0 Clang Tooling**\n- Parse code theo \u0111\u00fang context bi\u00ean d\u1ecbch th\u1ef1c t\u1ebf (\u0111\u1ea7y \u0111\u1ee7 flags, macro, include path).\n- D\u00f9ng Clang Tooling (libTooling, clang-query, clang-tidy) \u0111\u1ec3 ph\u00e2n t\u00edch s\u00e2u h\u01a1n, c\u00f3 th\u1ec3 nh\u1eadn di\u1ec7n lambda, template, macro, function pointer.\n\n#### 2. **K\u1ebft h\u1ee3p v\u1edbi CodeQL ho\u1eb7c c\u00e1c c\u00f4ng c\u1ee5 ph\u00e2n t\u00edch t\u0129nh n\u00e2ng cao**\n- CodeQL c\u00f3 th\u1ec3 truy v\u1ebft call graph, data flow, v\u00e0 nh\u1eadn di\u1ec7n c\u00e1c h\u00e0m \u0111\u01b0\u1ee3c g\u1ecdi qua lambda, macro, template, function pointer.\n- C\u00f3 th\u1ec3 vi\u1ebft truy v\u1ea5n \u0111\u1ec3 t\u00ecm c\u00e1c \u0111i\u1ec3m truy c\u1eadp bi\u1ebfn trong nhi\u1ec1u lu\u1ed3ng, k\u1ec3 c\u1ea3 qua callback/lambda.\n\n#### 3. **S\u1eed d\u1ee5ng Clang Static Analyzer ho\u1eb7c Cppcheck**\n- C\u00e1c tool n\u00e0y c\u00f3 th\u1ec3 ph\u00e2n t\u00edch data flow, control flow, v\u00e0 nh\u1eadn di\u1ec7n c\u00e1c v\u1ea5n \u0111\u1ec1 concurrency, k\u1ec3 c\u1ea3 khi d\u00f9ng lambda, macro, template.\n\n#### 4. **K\u1ebft h\u1ee3p nhi\u1ec1u ph\u01b0\u01a1ng ph\u00e1p**\n- D\u00f9ng Clang AST \u0111\u1ec3 thu th\u1eadp h\u00e0m c\u01a1 b\u1ea3n.\n- D\u00f9ng CodeQL ho\u1eb7c Cppcheck \u0111\u1ec3 ph\u00e2n t\u00edch s\u00e2u c\u00e1c tr\u01b0\u1eddng h\u1ee3p \u0111\u1eb7c bi\u1ec7t.\n- D\u00f9ng compile_commands.json \u0111\u1ec3 parse \u0111\u00fang context t\u1eebng file.\n\n#### 5. **Ph\u00e2n t\u00edch runtime (dynamic analysis)**\n- D\u00f9ng c\u00e1c tool nh\u01b0 ThreadSanitizer, Helgrind, ho\u1eb7c c\u00e1c framework ki\u1ec3m tra concurrency khi ch\u1ea1y th\u1ef1c t\u1ebf \u0111\u1ec3 ph\u00e1t hi\u1ec7n race condition m\u00e0 static analysis kh\u00f4ng nh\u1eadn di\u1ec7n \u0111\u01b0\u1ee3c.\n\n---\n\n**T\u00f3m l\u1ea1i:**  \n- \u0110\u1ec3 ph\u00e2n t\u00edch ch\u00ednh x\u00e1c c\u00e1c d\u1ef1 \u00e1n ph\u1ee9c t\u1ea1p, n\u00ean k\u1ebft h\u1ee3p Clang Tooling (v\u1edbi compile_commands.json), CodeQL, Cppcheck, v\u00e0 c\u00e1c tool runtime nh\u01b0 ThreadSanitizer.\n- Kh\u00f4ng c\u00f3 m\u1ed9t ph\u01b0\u01a1ng ph\u00e1p duy nh\u1ea5t n\u00e0o gi\u1ea3i quy\u1ebft ho\u00e0n to\u00e0n m\u1ecdi tr\u01b0\u1eddng h\u1ee3p ph\u1ee9c t\u1ea1p c\u1ee7a C++.\n- N\u00ean d\u00f9ng nhi\u1ec1u l\u1edbp ph\u00e2n t\u00edch (static + dynamic) v\u00e0 parse code theo \u0111\u00fang context bi\u00ean d\u1ecbch th\u1ef1c t\u1ebf.\n\nN\u1ebfu b\u1ea1n mu\u1ed1n h\u01b0\u1edbng d\u1eabn c\u1ee5 th\u1ec3 v\u1ec1 CodeQL, compile_commands.json, ho\u1eb7c c\u00e1c tool runtime, h\u00e3y y\u00eau c\u1ea7u chi ti\u1ebft!\n\nClang Static Analyzer **kh\u00f4ng tr\u1ef1c ti\u1ebfp xu\u1ea5t ra danh s\u00e1ch c\u00e1c h\u00e0m ch\u1ea1y trong ng\u1eef c\u1ea3nh multi-thread**. C\u00f4ng c\u1ee5 n\u00e0y ch\u1ee7 y\u1ebfu ph\u00e1t hi\u1ec7n c\u00e1c l\u1ed7i nh\u01b0 race condition, deadlock, memory leak, nh\u01b0ng kh\u00f4ng li\u1ec7t k\u00ea call graph ho\u1eb7c c\u00e1c h\u00e0m \u0111\u01b0\u1ee3c th\u1ef1c thi b\u1edfi nhi\u1ec1u thread.\n\n**Gi\u1ea3i th\u00edch chi ti\u1ebft:**\n- Clang Static Analyzer s\u1ebd b\u00e1o l\u1ed7i khi ph\u00e1t hi\u1ec7n truy c\u1eadp bi\u1ebfn kh\u00f4ng \u0111\u1ed3ng b\u1ed9 gi\u1eefa c\u00e1c thread, nh\u01b0ng kh\u00f4ng xu\u1ea5t ra danh s\u00e1ch h\u00e0m n\u00e0o b\u1ecb \u1ea3nh h\u01b0\u1edfng ho\u1eb7c h\u00e0m n\u00e0o l\u00e0 entrypoint c\u1ee7a thread.\n- N\u1ebfu b\u1ea1n mu\u1ed1n l\u1ea5y danh s\u00e1ch c\u00e1c h\u00e0m ch\u1ea1y trong ng\u1eef c\u1ea3nh multi-thread, b\u1ea1n c\u1ea7n d\u00f9ng Clang AST, CodeQL, ho\u1eb7c c\u00e1c tool ph\u00e2n t\u00edch call graph chuy\u00ean bi\u1ec7t (ho\u1eb7c t\u1ef1 vi\u1ebft script ph\u00e2n t\u00edch AST).\n\n**T\u00f3m l\u1ea1i:**  \n- Clang Static Analyzer gi\u00fap ph\u00e1t hi\u1ec7n l\u1ed7i concurrency, nh\u01b0ng kh\u00f4ng xu\u1ea5t ra danh s\u00e1ch h\u00e0m multi-thread.\n- N\u1ebfu c\u1ea7n danh s\u00e1ch h\u00e0m, h\u00e3y d\u00f9ng Clang AST, CodeQL, ho\u1eb7c c\u00e1c tool call graph kh\u00e1c.\n\nN\u1ebfu b\u1ea1n mu\u1ed1n h\u01b0\u1edbng d\u1eabn d\u00f9ng CodeQL ho\u1eb7c Clang AST \u0111\u1ec3 l\u1ea5y danh s\u00e1ch h\u00e0m multi-thread, t\u00f4i c\u00f3 th\u1ec3 h\u1ed7 tr\u1ee3 chi ti\u1ebft!\n\n\u0110\u00fang, Clang AST nh\u01b0 c\u00e1ch b\u1ea1n \u0111ang implement **kh\u00f4ng x\u1eed l\u00fd tri\u1ec7t \u0111\u1ec3 cho code ph\u1ee9c t\u1ea1p d\u00f9ng lambda, macro, template, function pointer, ho\u1eb7c callback**.\n\n**L\u00fd do:**\n- Lambda trong C++ \u0111\u01b0\u1ee3c Clang AST nh\u1eadn di\u1ec7n l\u00e0 m\u1ed9t ki\u1ec3u node \u0111\u1eb7c bi\u1ec7t (LambdaExpr), kh\u00f4ng ph\u1ea3i FUNCTION_DECL, n\u00ean kh\u00f4ng d\u1ec5 truy v\u1ebft nh\u01b0 h\u00e0m th\u01b0\u1eddng.\n- N\u1ebfu thread entrypoint l\u00e0 lambda, b\u1ea1n s\u1ebd kh\u00f4ng c\u00f3 t\u00ean h\u00e0m c\u1ee5 th\u1ec3 \u0111\u1ec3 trace call graph, v\u00e0 kh\u00f4ng th\u1ec3 x\u00e1c \u0111\u1ecbnh r\u00f5 c\u00e1c h\u00e0m b\u1ecb \u1ea3nh h\u01b0\u1edfng trong multi-thread context.\n- Macro, template, function pointer, callback c\u0169ng kh\u00f3 trace v\u00ec Clang AST ch\u1ec9 ph\u00e2n t\u00edch c\u00fa ph\u00e1p, kh\u00f4ng ph\u00e2n t\u00edch lu\u1ed3ng th\u1ef1c thi \u0111\u1ed9ng ho\u1eb7c c\u00e1c tr\u01b0\u1eddng h\u1ee3p ph\u1ee9c t\u1ea1p.\n\n**K\u1ebft lu\u1eadn:**  \n- Clang AST ch\u1ec9 ph\u00f9 h\u1ee3p cho code C++ c\u00f3 c\u1ea5u tr\u00fac r\u00f5 r\u00e0ng, h\u00e0m entrypoint l\u00e0 h\u00e0m user \u0111\u1ecbnh ngh\u0129a.\n- V\u1edbi code ph\u1ee9c t\u1ea1p d\u00f9ng lambda, macro, template, function pointer, b\u1ea1n c\u1ea7n k\u1ebft h\u1ee3p th\u00eam c\u00e1c tool kh\u00e1c (CodeQL, static analyzer n\u00e2ng cao, ho\u1eb7c dynamic analysis).\n\nN\u1ebfu b\u1ea1n mu\u1ed1n ph\u00e2n t\u00edch s\u00e2u lambda, c\u1ea7n vi\u1ebft logic nh\u1eadn di\u1ec7n LambdaExpr v\u00e0 ph\u00e2n t\u00edch body c\u1ee7a lambda, nh\u01b0ng v\u1eabn c\u00f3 nhi\u1ec1u gi\u1edbi h\u1ea1n v\u00e0 kh\u00f4ng th\u1ec3 trace call graph nh\u01b0 h\u00e0m th\u01b0\u1eddng.\n\n# callstack\nC\u00f3 hai c\u00e1ch \u0111\u1ec3 ph\u00e2n t\u00edch call stack:\n\n1. **Ph\u00e2n t\u00edch t\u0129nh (static analysis)**  \n   - D\u00f9ng AST \u0111\u1ec3 x\u00e2y d\u1ef1ng call graph: x\u00e1c \u0111\u1ecbnh h\u00e0m n\u00e0o g\u1ecdi h\u00e0m n\u00e0o, t\u1eeb \u0111\u00f3 bi\u1ebft lu\u1ed3ng th\u1ef1c thi ti\u1ec1m n\u0103ng.\n   - Kh\u00f4ng c\u1ea7n ch\u1ea1y ch\u01b0\u01a1ng tr\u00ecnh, nh\u01b0ng kh\u00f4ng th\u1ec3 bi\u1ebft ch\u00ednh x\u00e1c call stack th\u1ef1c t\u1ebf n\u1ebfu c\u00f3 c\u00e1c nh\u00e1nh \u0111\u1ed9ng, virtual, function pointer, v.v.\n\n2. **Ph\u00e2n t\u00edch \u0111\u1ed9ng (dynamic analysis)**  \n   - Build v\u00e0 ch\u1ea1y ch\u01b0\u01a1ng tr\u00ecnh, d\u00f9ng c\u00e1c c\u00f4ng c\u1ee5 nh\u01b0 gdb, lldb, Valgrind, ThreadSanitizer, ho\u1eb7c th\u00eam m\u00e3 log \u0111\u1ec3 ghi l\u1ea1i call stack khi ch\u01b0\u01a1ng tr\u00ecnh th\u1ef1c thi.\n   - C\u00f3 th\u1ec3 d\u00f9ng macro ho\u1eb7c hook \u0111\u1ec3 in call stack t\u1ea1i c\u00e1c \u0111i\u1ec3m truy c\u1eadp bi\u1ebfn nghi ng\u1edd.\n   - K\u1ebft qu\u1ea3 ph\u1ea3n \u00e1nh \u0111\u00fang call stack th\u1ef1c t\u1ebf, nh\u01b0ng ch\u1ec9 cho c\u00e1c tr\u01b0\u1eddng h\u1ee3p \u0111\u00e3 ch\u1ea1y qua.\n\nN\u1ebfu mu\u1ed1n l\u1ea5y call stack th\u1ef1c t\u1ebf:\n- Build ch\u01b0\u01a1ng tr\u00ecnh v\u1edbi debug symbols (`-g`).\n- Ch\u1ea1y v\u1edbi gdb/lldb, \u0111\u1eb7t breakpoint t\u1ea1i h\u00e0m ho\u1eb7c bi\u1ebfn nghi ng\u1edd, d\u00f9ng l\u1ec7nh `bt` (backtrace) \u0111\u1ec3 l\u1ea5y call stack.\n- Ho\u1eb7c d\u00f9ng ThreadSanitizer (`-fsanitize=thread`) \u0111\u1ec3 t\u1ef1 \u0111\u1ed9ng ph\u00e1t hi\u1ec7n race v\u00e0 in call stack khi ph\u00e1t hi\u1ec7n l\u1ed7i.\n\nT\u00f3m l\u1ea1i:  \n- Ph\u00e2n t\u00edch t\u0129nh ch\u1ec9 cho call graph ti\u1ec1m n\u0103ng.  \n- Ph\u00e2n t\u00edch \u0111\u1ed9ng (build v\u00e0 ch\u1ea1y) m\u1edbi l\u1ea5y \u0111\u01b0\u1ee3c call stack th\u1ef1c t\u1ebf t\u1ea1i th\u1eddi \u0111i\u1ec3m truy c\u1eadp bi\u1ebfn.  \nB\u1ea1n mu\u1ed1n h\u01b0\u1edbng d\u1eabn chi ti\u1ebft c\u00e1ch l\u1ea5y call stack b\u1eb1ng gdb/lldb ho\u1eb7c ThreadSanitizer kh\u00f4ng?\n\n\n## Example\n\ncd /home/worker/src/codefun/deepl/mcp_server\n### tao moi truong ao 1 lan dau\nrm -rf venv\nsudo apt install python3.12-venv\npython3 -m venv venv \n\n### kich hoat moi truong ao neu mo new terminal\nsource venv/bin/activate \n\n### luon cai lai khi thay doi server code\npip install -e .\n\n## run server\nstart server trong mcp.json\nmo copilot chat cua so moi (copilot tu dong ket noi server)\ngo: fetch_lgedv_rule\n\n## xem log\ncat /tmp/mcp_simple_prompt.log\n\n## upload package\nTruy c\u1eadp https://pypi.org/account/register/\n\u0110\u0103ng k\u00fd t\u00e0i kho\u1ea3n v\u00e0 x\u00e1c th\u1ef1c email.\n\n(xoa existing venv)\nrm -rf venv\n\nsudo apt install python3.12-venv\nsource venv/bin/activate\npip install build twine\n(trong thu muc chua pyproject.toml)\npip install build\npython -m build\n\nK\u1ebft qu\u1ea3: th\u01b0 m\u1ee5c dist/ s\u1ebd c\u00f3 file .whl v\u00e0 .tar.gz\n\nupload len PyPI\ntwine upload dist/*\n\n## user install\npython3 -m venv venv\nsource venv/bin/activate\npip install codeguard-taikt\n\n## user setup mcp.json\n\"servers\": {\n  \"codeguard\": {\n    \"command\": \"/duong_dan_toi_venv/bin/codeguard\",\n    \"args\": [\"--transport\", \"stdio\"]\n  }\n}\n\n## When use MCP resource\ndung khi co file markdown, vi cau truc don gian, tham khao cach lay lgedv rule(markdown) bang mcp resource trong code hien tai \nNeu lay resouce la cpp file, no khong co cau truc nen AI agent kho hieu, khong the parse\nmetadata type.\n\n## note\nC\u00f3, r\u1ea5t c\u1ea7n thi\u1ebft ph\u1ea3i c\u00f3 file __init__.py trong th\u01b0 m\u1ee5c package (v\u00ed d\u1ee5: mcp_server/) n\u1ebfu b\u1ea1n mu\u1ed1n Python nh\u1eadn di\u1ec7n \u0111\u00f3 l\u00e0 m\u1ed9t package h\u1ee3p l\u1ec7 \u0111\u1ec3 import (v\u00ed d\u1ee5: import mcp_server.server). File n\u00e0y c\u00f3 th\u1ec3 r\u1ed7ng, ch\u1ec9 c\u1ea7n t\u1ed3n t\u1ea1i.\n\nFile __main__.py kh\u00f4ng b\u1eaft bu\u1ed9c, tr\u1eeb khi b\u1ea1n mu\u1ed1n ch\u1ea1y package \u0111\u00f3 nh\u01b0 m\u1ed9t module (python -m mcp_server). \u0110\u1ed1i v\u1edbi tr\u01b0\u1eddng h\u1ee3p s\u1eed d\u1ee5ng entry point script nh\u01b0 mcp-taikt = \"mcp_server.server:main\", b\u1ea1n kh\u00f4ng c\u1ea7n __main__.py, ch\u1ec9 c\u1ea7n __init__.py l\u00e0 \u0111\u1ee7.\n\nT\u00f3m l\u1ea1i:\n- __init__.py: B\u1eaft bu\u1ed9c \u0111\u1ec3 Python nh\u1eadn di\u1ec7n package.\n- __main__.py: Ch\u1ec9 c\u1ea7n n\u1ebfu mu\u1ed1n ch\u1ea1y python -m <package>. Kh\u00f4ng b\u1eaft bu\u1ed9c cho entry point script.\n\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "A simple MCP server taikt",
    "version": "0.1.1",
    "project_urls": null,
    "split_keywords": [
        "automation",
        " fetch",
        " llm",
        " mcp",
        " web"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "b4e37cb5336a4af55fe9c4fba4ee658d2664fc83e6acea3496069c045bfe698e",
                "md5": "c7031958065cc51fc552d7846e5097e0",
                "sha256": "6ac03a0223c38ad6c6eb07d9c96a1aa3e489bb82e6871bed2463d83e05788e8b"
            },
            "downloads": -1,
            "filename": "codeguard_taikt-0.1.1-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "c7031958065cc51fc552d7846e5097e0",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.10",
            "size": 70274,
            "upload_time": "2025-07-18T10:27:00",
            "upload_time_iso_8601": "2025-07-18T10:27:00.160680Z",
            "url": "https://files.pythonhosted.org/packages/b4/e3/7cb5336a4af55fe9c4fba4ee658d2664fc83e6acea3496069c045bfe698e/codeguard_taikt-0.1.1-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "877a2b2a9b1cd140a47f3931e8c462dda54d13ada8b2fb72befb04dd64d88ba5",
                "md5": "062d211058341df9aefcea2795a8a451",
                "sha256": "2af3bf9c6c2f7c86c3df6e3080f649f99ca6a21b7eb4299ab78f1e54ba34ddcd"
            },
            "downloads": -1,
            "filename": "codeguard_taikt-0.1.1.tar.gz",
            "has_sig": false,
            "md5_digest": "062d211058341df9aefcea2795a8a451",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.10",
            "size": 120118,
            "upload_time": "2025-07-18T10:27:01",
            "upload_time_iso_8601": "2025-07-18T10:27:01.586238Z",
            "url": "https://files.pythonhosted.org/packages/87/7a/2b2a9b1cd140a47f3931e8c462dda54d13ada8b2fb72befb04dd64d88ba5/codeguard_taikt-0.1.1.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-07-18 10:27:01",
    "github": false,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "lcname": "codeguard-taikt"
}
        
Elapsed time: 1.18690s