MCP Browser Automation Server
by hrmeetsingh
- src
- apple_notes_mcp
- proto
// Note: These are directly copied from https://github.com/threeplanetssoftware/apple_cloud_notes_parser/blob/master/proto/notestore.proto
// Their work is amazing. Without these I would be absolutely lost.
// And I copied it from the excellent https://github.com/HamburgChimps/apple-notes-liberator
syntax = "proto2";
package com.ciofecaforensics;
//
// Common classes used across a few types
//
//Represents a color
message Color {
optional float red = 1;
optional float green = 2;
optional float blue = 3;
optional float alpha = 4;
}
// Represents an attachment (embedded object)
message AttachmentInfo {
optional string attachment_identifier = 1;
optional string type_uti = 2;
}
// Represents a font
message Font {
optional string font_name = 1;
optional float point_size = 2;
optional int32 font_hints = 3;
}
// Styles a "Paragraph" (any run of characters in an AttributeRun)
message ParagraphStyle {
optional int32 style_type = 1 [default = -1];
optional int32 alignment = 2;
optional int32 indent_amount = 4;
optional Checklist checklist = 5;
}
// Represents a checklist item
message Checklist {
optional bytes uuid = 1;
optional int32 done = 2;
}
// Represents an object that has pointers to a key and a value, asserting
// somehow that the key object has to do with the value object.
message DictionaryElement {
optional ObjectID key = 1;
optional ObjectID value = 2;
}
// A Dictionary holds many DictionaryElements
message Dictionary {
repeated DictionaryElement element = 1;
}
// ObjectIDs are used to identify objects within the protobuf, offsets in an arry, or
// a simple String.
message ObjectID {
optional uint64 unsigned_integer_value = 2;
optional string string_value = 4;
optional int32 object_index = 6;
}
// Register Latest is used to identify the most recent version
message RegisterLatest {
optional ObjectID contents = 2;
}
// MapEntries have a key that maps to an array of key items and a value that points to an object.
message MapEntry {
optional int32 key = 1;
optional ObjectID value = 2;
}
// Represents a "run" of characters that need to be styled/displayed/etc
message AttributeRun {
optional int32 length = 1;
optional ParagraphStyle paragraph_style = 2;
optional Font font = 3;
optional int32 font_weight = 5;
optional int32 underlined = 6;
optional int32 strikethrough = 7;
optional int32 superscript = 8; //Sign indicates super/sub
optional string link = 9;
optional Color color = 10;
optional AttachmentInfo attachment_info = 12;
}
//
// Classes related to the overall Note protobufs
//
// Overarching object in a ZNOTEDATA.ZDATA blob
message NoteStoreProto {
optional Document document = 2;
}
// A Document has a Note within it.
message Document {
optional int32 version = 2;
optional Note note = 3;
}
// A Note has both text, and then a lot of formatting entries.
// Other fields are present and not yet included in this proto.
message Note {
optional string note_text = 2;
repeated AttributeRun attribute_run = 5;
}
//
// Classes related to embedded objects
//
// Represents the top level object in a ZMERGEABLEDATA cell
message MergableDataProto {
optional MergableDataObject mergable_data_object = 2;
}
// Similar to Document for Notes, this is what holds the mergeable object
message MergableDataObject {
optional int32 version = 2; // Asserted to be version in https://github.com/dunhamsteve/notesutils
optional MergeableDataObjectData mergeable_data_object_data = 3;
}
// This is the mergeable data object itself and has a lot of entries that are the parts of it
// along with arrays of key, type, and UUID items, depending on type.
message MergeableDataObjectData {
repeated MergeableDataObjectEntry mergeable_data_object_entry = 3;
repeated string mergeable_data_object_key_item = 4;
repeated string mergeable_data_object_type_item = 5;
repeated bytes mergeable_data_object_uuid_item = 6;
}
// Each entry is part of the pbject. For example, one entry might be identifying which
// UUIDs are rows, and another might hold the text of a cell.
message MergeableDataObjectEntry {
optional RegisterLatest register_latest = 1;
optional List list = 5;
optional Dictionary dictionary = 6;
optional UnknownMergeableDataObjectEntryMessage unknown_message = 9;
optional Note note = 10;
optional MergeableDataObjectMap custom_map = 13;
optional OrderedSet ordered_set = 16;
}
// This is unknown, it first was noticed in folder order analysis.
message UnknownMergeableDataObjectEntryMessage {
optional UnknownMergeableDataObjectEntryMessageEntry unknown_entry = 1;
}
// This is unknown, it first was noticed in folder order analysis.
// "unknown_int2" is where the folder order is stored
message UnknownMergeableDataObjectEntryMessageEntry {
optional int32 unknown_int1 = 1;
optional int64 unknown_int2 = 2;
}
// The Object Map uses its type to identify what you are looking at and
// then a map entry to do something with that value.
message MergeableDataObjectMap {
optional int32 type = 1;
repeated MapEntry map_entry = 3;
}
// An ordered set is used to hold structural information for embedded tables
message OrderedSet {
optional OrderedSetOrdering ordering = 1;
optional Dictionary elements = 2;
}
// The ordered set ordering identifies rows and columns in embedded tables, with an array
// of the objects and contents that map lookup values to originals.
message OrderedSetOrdering {
optional OrderedSetOrderingArray array = 1;
optional Dictionary contents = 2;
}
// This array holds both the text to replace and the array of UUIDs to tell what
// embedded rows and columns are.
message OrderedSetOrderingArray {
optional Note contents = 1;
repeated OrderedSetOrderingArrayAttachment attachment = 2;
}
// This array identifies the UUIDs that are embedded table rows or columns
message OrderedSetOrderingArrayAttachment {
optional int32 index = 1;
optional bytes uuid = 2;
}
// A List holds details about multiple objects
message List {
repeated ListEntry list_entry = 1;
}
// A list Entry holds details about a specific object
message ListEntry {
optional ObjectID id = 2;
optional ListEntryDetails details = 3; // I dislike this naming, but don't have better information
optional ListEntryDetails additional_details = 4;
}
// List Entry Details hold another object ID and unidentified mapping
message ListEntryDetails {
optional ListEntryDetailsKey list_entry_details_key= 1;
optional ObjectID id = 2;
}
message ListEntryDetailsKey {
optional int32 list_entry_details_type_index = 1;
optional int32 list_entry_details_key = 2;
}